これはいくつかの関数にあります:
BigClass big;
// prepare big somehow
OtherClass foo(std::move(big), maybe, other, params);
// know that we won't be using "big" after this.
最近のほとんどの C++ コーダーは、移動を保証するために実際にそこに移動するでしょうか?
これはいくつかの関数にあります:
BigClass big;
// prepare big somehow
OtherClass foo(std::move(big), maybe, other, params);
// know that we won't be using "big" after this.
最近のほとんどの C++ コーダーは、移動を保証するために実際にそこに移動するでしょうか?
特定のコードでは、直接移動するか、まったく移動しません。コンパイラは、左辺値から移動することはありません (つまり、eXpiringではありません)。
動きがあるようにそこに入れstd::move
ます。そうでなければ動かないからです。:)
別の方法は次のとおりです。
auto MakeBig = [&]()->BigClass {
BigClass big;
//prepare big somehow
return big; // must be a `move`, if not elided!
};
OtherClass foo(MakeBig(), maybe, other, params);
または、気弱でない場合は、次のようにします。
OtherClass foo([&]()->BigClass {
BigClass big;
//prepare big somehow
return big; // must be a `move`, if not elided!
}(), maybe, other, params);
big
ここで、 up の作成をラムダにラップしてから、作成を延期します。これは常に機能するとは限りません。
このパターンの利点はfoo
、最初の引数を値で受け取る場合に Move を省略できることです。値で受け取ることは、とにかくコピーを作成するmove
有能なクラスに対して正しい方法です。OtherClass
最初の引数を値でとらない場合foo
でも、構築用に作成されたテンポラリは省略できるため、(テンポラリと の間でfoo
) 1 つの移動のみが発生します。