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

楼主: loveflames (咕啾咕啾魔法阵)   2018-06-24 13:11:51
以前刚好有研究过这个
NRVO:
1.启动条件,缺一不可
return语句为非静态之物件名称
物件与函数返回类型相同,忽略CV修饰
该物件非函数的参数
2.符合以上条件时可省略ctor的呼叫,特别注意以下事项
copy语意仍在
属于implementation-defined
3.阻止NRVO的情况
物件类型与函数返回类型不同,例如两种类型有继承关系时
涉及if/else这种条件分支
return语句不是"物件名称",例如reference(非物件)、三元运算子、物件成员、指标指
向的内容
RVO:
1.启动条件
以prvalue初始相同类型时,忽略CV修饰
2.符合以上条件时可省略ctor的呼叫,特别注意以下事项
copy语意仍在
属于implementation-defined,仅存在C++17以前的版本
guaranteed copy elision:
1.启动条件
以prvalue初始相同类型时,忽略CV修饰
2.符合以上条件时可省略ctor的呼叫,特别注意以下事项
无copy语意
属于standard,C++17以后才有
move ctor:
1.启动条件,择一即可
用std::move包起来
return语句为非静态之物件名称
return语句为prvalue
2.符合以上条件时可呼叫move ctor,特别注意以下事项
有NRVO、RVO、guaranteed copy elision时不考虑这个
3.阻止move的情况,此时会呼叫copy ctor
所选ctor的参数类型不是该变量类型的rvalue ref时,以lvalue重新选择(两类型有继承
关系时发生)
物件不可为const,因为T(T&&)不吃const
return语句不是"物件名称",例如reference(非物件)
作者: ilikekotomi (Young)   2018-06-24 14:26:00
感谢整理
作者: a58524andy (a58524andy)   2018-06-24 16:23:00
感谢整理 总之Q2中g把吃进来的rvalue ref当成xvalue但是这个xvalue还是一个reference,因此不会用mv ctor比较不懂的是copy semantics的保留与否是什么意思呢?
作者: firose (guest也是也是也是也是也)   2018-06-24 17:09:00
就是需不需要存在的意思 你要先能存取才能 copy elision
作者: a58524andy (a58524andy)   2018-06-24 23:46:00
喔喔 https://goo.gl/8vVaVX 另参照这里 总之c++17对于部分写法直接当作没有copy这个语意存在了感谢提点
作者: KanzakiHAria (神崎・H・アリア)   2018-06-25 04:19:00
也太复杂XD

Links booklink

Contact Us: admin [ a t ] ucptt.com