3 回答
TA贡献1744条经验 获得超4个赞
Foo f(){ Foo result; mangle(result); return result;}
return
TA贡献1806条经验 获得超8个赞
moved
N 3337标准草案第12.8节
当满足某些条件时,即使对象的复制/移动构造函数和/或析构函数有副作用,也允许实现省略类对象的复制/移动构造。在这种情况下,实现将省略的复制/移动操作的源和目标简单地视为引用同一个对象的两种不同方式,而该对象的销毁发生在如果不进行优化就会销毁这两个对象的后期。 复制省略,允许在下列情况下(可合并以消除多份副本): [...]
例:
class Thing {public:Thing(); ~Thing(); Thing(const Thing&);};Thing f() { Thing t; return t;}Thing t2 = f();
在这里,可以将省略的条件组合起来,以消除对类的复制构造函数的两个调用。 Thing
*复制本地自动对象 t
到函数返回值的临时对象中。 f()
以及将该临时对象复制到对象中。 t2
..有效地,局部对象的构造 t
可以被视为直接初始化全局对象。 t2
,该物体的破坏将发生在程序出口。向 Thing
具有相同的效果,但它是从临时对象移动到 t2
那是被剥夺的。- 终例 ]
如果符合或将满足复制操作的省略条件,除非源对象是函数参数,并且要复制的对象由lvalue指定,则首先执行重载解析,以选择副本的构造函数,就好像该对象是由rvalue指定的一样。如果重载解析失败,或者所选构造函数的第一个参数的类型不是对象类型的rvalue引用(可能是cv限定的),则再次执行重载解析,将对象视为lvalue。
TA贡献1891条经验 获得超3个赞
return buffer;
buffer
return std::move( buffer );
buffer
std::move
Buffer read(Buffer&& buffer) { //... return std::move( buffer );}
buffer
std::move
std::move
move
forward
move
- 3 回答
- 0 关注
- 697 浏览
添加回答
举报