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 );}bufferstd::movestd::move
moveforwardmove
- 3 回答
- 0 關注
- 739 瀏覽
添加回答
舉報
