20

2 つのベクトルがあり、一方を他方に移動するとしv1 = std::move(v2)ます。v2この後も使える状態でしょうか?

4

3 に答える 3

28

n3290 から、17.6.5.15 ライブラリ型の移動元状態 [lib.types.movedfrom]

  1. C++ 標準ライブラリで定義されている型のオブジェクトは、(12.8) から移動できます。移動操作は、明示的に指定することも、暗黙的に生成することもできます。特に指定がない限り、そのような移動元オブジェクトは、有効であるが指定されていない状態に置かれます。

状態が有効であるため、これは安全に操作できることを意味しますv2(たとえば、既知の状態に戻す割り当てによって)。v2.empty()ただし、指定されていないため、たとえば、この状態にある限り、特定の値に依存することはできません(ただし、呼び出してもプログラムはクラッシュしません)。

この移動セマンティクスの公理 (「Moved from objects are left in valid but unspecified state」) は、標準ライブラリ コンポーネントだけでなく、すべてのコードが (ほとんどの場合) 目指すべきものであることに注意してください。コピー コンストラクターのセマンティクスは、コピーを作成する必要がありますが、強制されません。

于 2011-10-28T14:12:49.450 に答える
6

いいえ、不特定の状態で放置されています。

open-std-org の記事からの抜粋-

.. move() は、ターゲットに引数の値を渡しますが、ソースの値を保持する義務はありません。したがって、ベクトルの場合、move() は、すべての要素をコピーする必要がないように、その引数を容量ゼロのベクトルのままにしておくことが合理的に期待できます。つまり、move は潜在的に破壊的な読み取りです。

于 2011-10-28T13:52:06.790 に答える