17

重複の可能性:
移動元のオブジェクトで何ができますか?

結果を呼び出しstd::moveて関数に渡した後、通常、移動したオブジェクトに後でアクセスすると、未定義の動作が発生することを想定する必要があります。

それらのアクセスを検出して警告することができるツールはありますか?例えば:

{
  Widget w;
  foo(std::move(w));
  // w may be undefined at this point

  w.doSomething(); // WARN
}

少なくとも、gcc 4.7.2そして文句を言わないclang 3.2でください。-Wall

更新:この質問を振り返ると、重要な点は、オブジェクトが移動された後もオブジェクトがまだ有効であるかどうかをコンパイラーが判断できないことです。提案N4034:Destructive Moveが受け入れられた場合、コンパイラーにはより多くのオプションがあると思います(ただし、移動が破壊的である場合のみ)。

4

1 に答える 1

15

また、そうすべきではありません。移動元のクラスの動作は、希望どおりです。コンパイラが警告すべきことではありません。

標準ライブラリオブジェクトの場合、moved-fromクラスは「有効ですが指定されていない状態」です。したがって、これを行うことは完全に合法です。

std::vector<int> v{20, 30, 40};
std::vector<int> v2 = std::move(v);
v = std::vector<int>{50, 60, 70, 80};

clearベクトルの現在の状態が何であるかは関係ありません。ベクトルをクリアするだけです。したがって、既知の状態にリセットされます。同様に、operator=現在の状態は関係ありません。既知の状態にリセットされます。

于 2013-01-27T21:56:22.077 に答える