1

重複の可能性:
C ++ 11の「movedfrom」オブジェクトの有効な状態を構成するものは何ですか?

次のようなことを考えてみてください。

class Foo {};  
std::vector<Foo> v( 5 );

次のようなことをすることは合法ですか?

v.front() = std::move( v.back() );  

後でこのようなことをした場合:

v.pop_back();  

より正確には、セマンティクスを受けたxvalueに何が必要かを知りたいですstd::move()
私はそれが(明らかに)破壊可能である必要があることを知っています。しかし、他に何かありますか?ed値のコピー/移動をバックグラウンドstd::vector::insert()で実行する可能性のある、またはその他の関数を呼び出すとします。 それはまだ合法ですか? std::move()

私の実際のケースでは、私はそれを持ってstd::vector<std::vector<Foo>>いて、それを使って何かをしています。しかし、それがまだアウターによって使用されているからに
合法であるかどうかはわかりません。std::move()std::vectorstd::vector

4

1 に答える 1

2

はい、これは有効です。移動元のオブジェクトはいつでも破棄できます。(これがC ++言語標準で指定されている場所、または指定されているかどうかはわかりませんが、移動元のオブジェクトを破棄できなかった場合は、すべての人がバグと見なすと確信しています。)移動元のオブジェクトを破棄します。コードは問題ありません。

標準ライブラリは、移動元のオブジェクトの状態に追加の要件を課し、標準ライブラリコンポーネントがインスタンス化されるすべてのタイプは、これらの追加のルールに従う必要があります。要点は、あるタイプの非移動元オブジェクトで有効な移動およびコピー操作は、そのタイプの移動元オブジェクトでも有効である必要があるということです。したがって、たとえば、最後の要素を移動した後、その要素に新しい値を割り当てることができます v.back() = Foo();

于 2012-08-25T18:12:41.430 に答える