私は2つのベクトルを持ち、1つをもう一方のベクトルに移動するとします。v1 = std::move(v2)
;この後でもv2
は使用可能な状態になりますか?移動はオブジェクトを使用可能な状態のままにしますか?
答えて
、17.6.5.15を移動-からライブラリー・タイプの状態[lib.types.movedfrom] C++標準ライブラリで定義されたタイプの
- オブジェクト(12.8)から移動させることができます。移動操作は明示的に指定することも、暗黙的に生成することもできます。別段の指定がない限り、そのような移動オブジェクトは有効であるが不特定の状態に置かれるものとする。状態が有効であるので
が、これはあなたが安全に(例えば、既知の状態に戻ってそれを置くことになる、それに割り当てることによって)v2
を操作できることを意味します。しかし、それは指定されていないので、例えば、この状態にある限り(ただし、呼び出してもプログラムをクラッシュさせることはありません)、v2.empty()
の特定の値に依存することはできません。
このセマンティクス( "オブジェクトは有効であるが、指定されていない状態から移動される")のこの公理は、標準ライブラリコンポーネントだけでなく、すべてのコードが(ほとんどの場合に)努力すべきものであることに注意してください。コピーコンストラクタの意味によく似ているはコピーを作成する必要がありますが、強制はしません。
+1ですが、書かれているように、 'v2 = std :: vector {};の後で' v2'が空であるかどうかわからないようです。 – Gabriel
@Gabriel良い点、編集順です。 –
いいえ、指定されていない状態です。
open-std-org記事からの抜粋 -
...動きは()そのターゲット引数の値が得られますが、そのソースの価値を維持する義務はありません。したがって、ベクトルの場合、move()はすべての要素をコピーする必要がないように、その引数をゼロ容量のベクトルとして残すことが合理的に期待できます。つまり、移動は潜在的に破壊的な読みです。 n3290から
不明な_but valid_状態のままです。つまり、オブジェクトが有効であるという前提条件だけを持つ方法でオブジェクトを使用することはできます。たとえば、移動元のベクトルに対してvector :: clear()を呼び出して、既知の状態にしてからオブジェクトを挿入することができます。 – bames53
__有効である必要があります。それ以外の場合は、オブジェクトがスコープから外れるとどうなるでしょう。ほとんどの場合、データストアには何も格納されませんが、それが何であれ、有効になります。 – Damon
複数の(抽象的な)妥当性のレベルがあります。言語に関する限り、移動後のオブジェクトはオブジェクトがまだ存在する限り有効であり、定義されていない動作などを引き起こすことなくデストラクタを呼び出すことができます。しかし、オブジェクトのコントラクトは移動されて変更されることがあります。例えば、ベクトルがゼロサイズ(容量を持たない)になったことは、有効なC++ベクトルですが、(現在は無効化されている)前提を検証せずにベクトル上の特定の要素を設定するメソッドを持つオブジェクトですベクトルが特定のサイズを持つ必要があります... – rwong
あなたはは、移動後にV2を使用したい場合は、あなたのような何かをしたいと思うでしょう。この時点で
v1 = std::move(v2);
v2.clear();
を、V1はV2とv2の元の内容が十分にありますがあります定義済みの空の状態。これはすべてのSTLコンテナ(とその点については文字列)で機能し、移動セマンティクスをサポートする独自のクラスを実装する場合は、おそらく同様のことをしたいと思うでしょう。
STLの特定の実装が実際にオブジェクトを空の状態のままにしている場合、2番目のclear()は本質的にno-opになります。実際、このような場合は、コンパイラが移動後にclear()を削除することが合法的な最適化となります。
- 1. スレッドは実行状態から実行可能状態にどのように移行しますか?
- 2. valgrindを使用してオブジェクトに到達可能な状態を確認する
- 3. Silverlight:可視状態と不可視状態の間に視覚的な遷移を追加します。
- 4. 状態パラメータを変更し、状態をリロードしません。実現可能か?
- 5. Salt-stackは利用可能なすべての状態をリストします
- 6. 理由のアプリを非アクティブ状態に移動しました
- 7. ui-routerを使用して親状態のみを表示すると、自動的に最後に選択した子状態に移動できますか?
- 8. WebSphereのWebコンテナ・スレッドは、実行可能な状態で最大スレッド状態でハングします
- 9. リソースマネージャーがスタンバイ状態からアクティブ状態に遷移しない
- 10. 角度動作サービスおよびコンポーネントでのオブジェクトの使用状況、競合状態の可能性
- 11. 状態パターンを使用するオブジェクトは、次の状態にどのように移行する必要がありますか?
- 12. 次の検索可能なテキストに移動します。
- 13. 移動可能なGUIオブジェクトHTML/CSS
- 14. angular.jsに状態をロードする前に、特定のコントローラに移動します。
- 15. ビジュアル状態を使用してオブジェクトのCanvas.Zindexを変更できますか?
- 16. どのようにプロジェクトを準備し、さまざまな状態でアクセス可能にするには?
- 17. 匿名の実行可能クラスコードを使用すると、デッドロック状態になりますが、ラムダでうまく動作します。
- 18. Azureのカスタムスクリプトが移行状態になっていました
- 19. UNKNOWN状態を移動するための状態
- 20. オブジェクトを状態オブジェクトの配列にプッシュします。 ReactJS
- 21. Flinkクエリ可能状態が動作しない
- 22. さまざまなホバー状態のボタンリソースを使用する
- 23. プロジェクトの外で休止状態のプロパティ設定ファイルを移動しますか?
- 24. 状態を変更せずにオブジェクトを空にしますか?
- 25. グローバルなJavascriptオブジェクトはどのように状態を保存しますか?
- 26. 可変スコープシングルトンの可能な競合状態ですか?
- 27. またはFTLで動作しない状態ですか?
- 28. スリープ状態にあるQThreadをスリープ状態にしますか?
- 29. 状態の外で解決を使用することは可能ですか?
- 30. jqueryを使用してリスト項目のアクティブ状態または選択状態を変更します
これはhttp://stackoverflow.com/q/7027523/576911の複製のようです。この回答を参照してください:http://stackoverflow.com/questions/7027523/what-can-i-do-with-a-moved-from-object/7028318#7028318前提条件に関して許可された操作について議論する質問に。 –