3 回答

TA貢獻(xiàn)1744條經(jīng)驗(yàn) 獲得超4個(gè)贊
Foo f(){ Foo result; mangle(result); return result;}
return

TA貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超8個(gè)贊
moved
N 3337標(biāo)準(zhǔn)草案第12.8節(jié)
當(dāng)滿足某些條件時(shí),即使對象的復(fù)制/移動(dòng)構(gòu)造函數(shù)和/或析構(gòu)函數(shù)有副作用,也允許實(shí)現(xiàn)省略類對象的復(fù)制/移動(dòng)構(gòu)造。在這種情況下,實(shí)現(xiàn)將省略的復(fù)制/移動(dòng)操作的源和目標(biāo)簡單地視為引用同一個(gè)對象的兩種不同方式,而該對象的銷毀發(fā)生在如果不進(jìn)行優(yōu)化就會(huì)銷毀這兩個(gè)對象的后期。 復(fù)制省略,允許在下列情況下(可合并以消除多份副本): [...]
例:
class Thing {public:Thing(); ~Thing(); Thing(const Thing&);};Thing f() { Thing t; return t;}Thing t2 = f();
在這里,可以將省略的條件組合起來,以消除對類的復(fù)制構(gòu)造函數(shù)的兩個(gè)調(diào)用。 Thing
*復(fù)制本地自動(dòng)對象 t
到函數(shù)返回值的臨時(shí)對象中。 f()
以及將該臨時(shí)對象復(fù)制到對象中。 t2
..有效地,局部對象的構(gòu)造 t
可以被視為直接初始化全局對象。 t2
,該物體的破壞將發(fā)生在程序出口。向 Thing
具有相同的效果,但它是從臨時(shí)對象移動(dòng)到 t2
那是被剝奪的。- 終例 ]
如果符合或?qū)M足復(fù)制操作的省略條件,除非源對象是函數(shù)參數(shù),并且要復(fù)制的對象由lvalue指定,則首先執(zhí)行重載解析,以選擇副本的構(gòu)造函數(shù),就好像該對象是由rvalue指定的一樣。如果重載解析失敗,或者所選構(gòu)造函數(shù)的第一個(gè)參數(shù)的類型不是對象類型的rvalue引用(可能是cv限定的),則再次執(zhí)行重載解析,將對象視為lvalue。

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊
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 關(guān)注
- 721 瀏覽
添加回答
舉報(bào)