1. ホーム
  2. c++

[解決済み] 移動したコンテナを再利用?

2023-03-21 16:36:31

質問

移動したコンテナを再利用する場合の正しい方法を教えてください。

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);

C++0x標準ドラフトを読んだ限りでは、ver3が正しいようです。移動後のオブジェクトは

"特に指定がない限り、移動元のオブジェクトは、有効だが指定されていない状態に置かれるものとする。 を有効だが指定されていない状態に置くものとします。

私は、"others specified"である例を見つけたことがありません。

私はver3が少し回りくどいと感じ、ver1の方がずっと良かったのですが、vec3はいくつかの追加最適化を可能にしますが、一方で簡単にミスを引き起こしかねません。

私の仮定は正しいですか?

どのように解決するのですか?

仕様書 17.3.26 項より "valid but unspecified state" です。

オブジェクトの不変量が満たされ、オブジェクトに対する操作がその型に対して指定されたように動作すること以外は指定されていないオブジェクトの状態 [ 例: もしオブジェクト x という型の std::vector<int> は有効だが指定されていない状態である。 x.empty() は は無条件に呼び出され x.front() が呼び出されるのは x.empty() が false を返した場合のみ呼び出されます。-終了例 ]。

したがって、オブジェクトは生きています。前提条件を必要としない操作であれば(最初に前提条件を検証しない限り)実行することができます。

clear は、例えば、前提条件を持ちません。そして、それはオブジェクトを既知の状態に戻します。だから、それをクリアして普通に使うだけでいい。