让我们假设我有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