以前刚好有研究过这个
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(非物件)