コンテナは移動されると、C 0x 標準ドラフトに従って「有効だが未指定の状態」になります。 。このような状況では、移動したコンテナを正しく再利用する方法を理解することが重要です。
次のコード スニペットを検討してください。
std::vector<int> container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: "Reset" container = std::vector<int>() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2);
標準のオプション ver3 に従って、これにはコンテナの再初期化が含まれます。コンテナを移動するのが正しいアプローチです。これは、移動操作の後、オブジェクトが未指定の状態になるためです。
標準では、「有効だが未指定の状態」を次のように定義しています。
「有効ではないオブジェクトの状態」オブジェクトの不変条件が満たされ、オブジェクトに対する操作がその型で指定されたとおりに動作することを除き、指定されています。
これは、移動元のオブジェクトが生きたままであり、移動できることを意味します。ただし、前提条件が満たされている場合に限ります。ベクターの場合、clear() を使用してコンテナをクリアすると、前提条件はなく、既知の状態に戻ります。
したがって、clear() を使用して、移動されたコンテナをリセットし、
移動したコンテナに対してclear()を呼び出すオプションver2も有効です。ただし、移動されたコンテナーが空であると想定して最適化が行われる可能性があります。 clear() を使用すると、最適化に関係なく、コンテナーが確実に既知の状態に戻されます。
何も行わないオプション ver1 は推奨されません。これは、移動後のコンテナーが不特定の状態になり、予期しない動作が発生する可能性があるためです。
以上が移動した C コンテナを再利用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。