讓我們假設我有struct Foo
與移動constructor
和operator=(Foo&&)
,我用它作爲數據成員:C++ std :: move在這裏不好?
Foo f()
{
Foo foo;
//code
return foo;
}
struct Boo {
Foo foo;
Boo() {
foo = f();//1
foo = std::move(f());//2
}
};
如果(2)我其實並不需要std::move
, 但如果我用在這裏,這是否會造成不好的結果, 就像阻止優化一樣?
我這樣說的:Why does std::move prevent RVO?
,並找出改變RVO
return foo;
到return std::move(foo);
原因禁用,但對於(2)不會造成類似的情況?如果是這樣,爲什麼?
無論如何,複製elision不適用於這種情況,因爲您正在調用'foo.operator ='。如果你有'Foo foo = std :: move(f());'這是初始化。 –
@ M.M但是'clang 3.7'對此有所警告,所以我想知道,它是警告生成中的缺陷,還是我錯過了一些東西 – user1244932
由於性能原因,這可能是不好的原因。在你的情況#2,你關心調用std :: move(f())已經是rhr的東西,所以移動是浪費的字符。我的經驗法則是,除非必須,否則您應該避免std :: move,並且您只需要在以非平凡方式轉讓所有權時。 – IdeaHat