作者loveflames (咕啾咕啾魔法阵)
看板C_and_CPP
标题Re: [问题] 关於c++11 ctor行为
时间Sun Jun 24 13:11:51 2018
以前刚好有研究过这个
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(非物件)
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 110.50.186.132
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_and_CPP/M.1529817114.A.F5B.html
※ 编辑: loveflames (110.50.186.132), 06/24/2018 13:56:45
1F:推 ilikekotomi: 感谢整理06/24 14:26
2F:推 a58524andy: 感谢整理 总之Q2中g把吃进来的rvalue ref当成xvalue06/24 16:23
3F:→ a58524andy: 但是这个xvalue还是一个reference,因此不会用mv ctor06/24 16:24
4F:→ a58524andy: 比较不懂的是copy semantics的保留与否是甚麽意思呢?06/24 16:28
5F:→ firose: 就是需不需要存在的意思 你要先能存取才能 copy elision06/24 17:09
改一下原文用语
※ 编辑: loveflames (110.50.186.132), 06/24/2018 19:57:18
7F:→ a58524andy: 对於部分写法直接当作没有copy这个语意存在了 06/24 23:48
8F:→ a58524andy: 感谢提点 06/24 23:48
9F:推 KanzakiHAria: 也太复杂XD 06/25 04:19