我知道,當通過值傳遞一個對象給一個函數時,如果有一個移動構造函數總是被調用,假設沒有複製elision。關於通過值返回對象怎麼樣?對象保證在返回時被移動?
例如,假設我們有一個具有移動構造函數的類Foo
,並且我們有一個返回Foo
對象的函數。
Foo g() {
Foo f;
// do something with f
return f;
}
如果我們假設沒有RVO,移動構造函數是否保證被調用?
更新:我想我沒有清楚地表明我的意圖。我只想知道我可以在最壞的情況下將對象移動而不是複製。 RVO或NRVO都會發生,我很高興。而且我也應該說移動構造函數和移動賦值不會被刪除並被正確實現。
是的,自動存儲中的本地對象在返回語句中被隱式視爲xvalues。 – ildjarn
@ildjarn:我認爲只有當你直接返回它。因此,我將這裏的'f'移到了函數中:'return do_something(f);'。 – GManNickG
@G ManNickG:我沒有時間去看待這些標準或警告,因此只能作出評論而不是回答。我認爲你是對的。 : - ] – ildjarn