はのは、私が移動constructor
とoperator=(Foo&&)
でstruct 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
、 が、何を必要としません、これは何か悪くしますか? は最適化を妨げるのですか?
私はこの読み:(2)それは似たような状況を引き起こすんWhy does std::move prevent RVO?
をしてRVO
のreturn foo;
return std::move(foo);
に原因の無効化を変更することを見つけるが、何は?もしそうなら、なぜですか?
この場合、 'foo.operator ='を呼び出すので、コピーelisionは適用されません。 'Foo foo = std :: move(f());'が初期化されていれば関係します。 –
@ M.Mしかし、 'clang 3.7'はこれについて警告しているので、警告生成のバグですか、何かが逃したのでしょうか? – user1244932
パフォーマンス上の理由でもないことも悪いことがあります。 #2の場合、str :: move(f())をすでにrhrと呼んでいるので、移動は無駄になります。私の経験則では、あなたがする必要がない限り、あなたはstd :: moveを避けなければならないということです。そして、あなたは自明ではない方法で所有権を移譲しなければなりません。 – IdeaHat