[问题] 关于c++11 ctor行为

楼主: a58524andy (a58524andy)   2018-06-23 18:10:49
开发平台(Platform): (Ex: Win10, Linux, ...)
win10 1803 [email protected]
编译器(Ex: GCC, clang, VC++...)+目标环境(跟开发平台不同的话需列出)
g++ (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
c++11
额外使用到的函数库(Library Used): (Ex: OpenGL, ...)
<iostream>
问题(Question):
有两个相似的case,烦请参照外部连结阅读;编译以及执行的选项如下
$ g++ -c my_PTT_post.cc
作者: bluesoul (忙死你老爸)   2018-06-23 18:50:00
1你的理解是对的
作者: KanzakiHAria (神崎・H・アリア)   2018-06-23 20:25:00
缩写看得很不舒服 Constructor就打完整一个物件实体化第一次的=不会使用operator=所以第一次=会呼叫constructormove可能慢的原因为复制成本太低std::move是一个function 所以还是会有离开回来例如int 型态还特地调用move就会造成过多的搬移成本move最值得使用的情境为:当一个需要deep copy的物件要用来初始化别人,这时候move就不需要copy但是如果这个东西之后还要继续用就无法使用move那只好回到使用copy简单说可以想像类似搬进去function的scope离开function 的时候这个东西会destruct
作者: legendmtg (CLANNAD)   2018-06-23 20:37:00
ctor是很惯用的缩写吧
作者: chchwy (mat)   2018-06-23 20:41:00
并没有什么实体化第一次不呼叫operator=的规则那是因为编译器开了RVO 你把RVO关掉就可以看见正确行为然后ctor/dtor根本就超常见
作者: Feis (永远睡不着 @@)   2018-06-24 01:09:00
名字
作者: BlazarArc (Midnight Sun)   2018-06-24 01:19:00
ctor很常见的缩写
作者: Feis (永远睡不着 @@)   2018-06-24 01:25:00
case 2. reference (cp), std::move (mv)
作者: steve1012 (steve)   2018-06-24 03:46:00
ctor 很ok的
作者: KanzakiHAria (神崎・H・アリア)   2018-06-24 06:20:00
你在讲什么?constructor的return是void哪有什么回传function return都是rvalue 建构子也是我终于看懂你的问题了......因为你的g不是回传reference type当然不会动到reference的constructor阿......你的问题是连最基本的三种呼叫和回传都没搞懂call by value, call by address,call by reference
作者: firose (guest也是也是也是也是也)   2018-06-24 07:04:00
这问题 (https://bit.ly/2K5zUvu) 也有人问但没答案感觉他是 xvalue 应该能安全 move 才对
作者: KanzakiHAria (神崎・H・アリア)   2018-06-24 07:34:00
因为在function内scope是lvalue reference也就是原PO的22行还要使用move才会cast回rvalue reference
作者: firose (guest也是也是也是也是也)   2018-06-24 07:53:00
问题是 case1 也是 lvalue 就可以 move
作者: KanzakiHAria (神崎・H・アリア)   2018-06-24 07:58:00
所以是RVO关不掉?RVO是c++11的standard名称是copy elision我把原PO的code改了一下 http://cpp.sh/4u43728行VS报错内容'return': cannot convert from 'myClass' to 'myClass &&'Clang报错内容rvalue reference to type 'myClass' cannot bind to lvalue of type 'myClass'
作者: loveflames (咕啾咕啾魔法阵)   2018-06-24 10:40:00
return语句为非静态物件名称时,才以move取代copy,rvalue ref并不是一个物件还有楼上那个错误讯息是因为decltype(auto)是推导出myClass &&不是你以为的myClass你可以把h函数想成这样

Links booklink

Contact Us: admin [ a t ] ucptt.com