7

これはいくつかの関数にあります:

BigClass big;
// prepare big somehow
OtherClass foo(std::move(big), maybe, other, params);
// know that we won't be using "big" after this.

最近のほとんどの C++ コーダーは、移動を保証するために実際にそこに移動するでしょうか?

4

3 に答える 3

10

特定のコードでは、直接移動するか、まったく移動しません。コンパイラは、左辺値から移動することはありません (つまり、eXpiringではありません)。

于 2013-02-07T19:43:56.567 に答える
1

動きがあるようにそこに入れ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 つの移動のみが発生します。

于 2013-02-07T19:43:22.247 に答える
0

C ++ 11を使用している場合、コンパイラーが自動的に移動します(R値参照)が、大きなオブジェクトを明示的に移動したい場合は、明示的に「移動」する必要があります。

std::move

詳しくは

于 2013-02-07T19:46:22.713 に答える