ホームページ  >  記事  >  バックエンド開発  >  移動元の `std::vector` は常に空ですか?

移動元の `std::vector` は常に空ですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-18 03:36:02832ブラウズ

Is a Moved-From `std::vector` Always Empty?

移動元ベクトルは常に空ですか?

C でオブジェクトを移動すると、オブジェクトは未指定の状態のままになります。このルールにはベクトルの明示的な除外はありませんが、空のベクトルにならない実現可能な実装を見つけるのは困難な場合があります。

Move Constructor

ベクトルの move コンストラクターは一定の複雑さを持たなければなりません。これには、移動元ベクトルからリソースを盗み、空のままにしておく必要があります。したがって、移動コンストラクターの場合、移動元ベクトルは常に空になります。

移動代入演算子

移動代入演算子の動作は、ベクトルのアロケーターによって異なります。主なケースは 3 つあります:

ケース 1:
Propagate_on_container_move_assignment が true です。

この場合、破棄、割り当て解除、アロケータの移動、およびメモリ バッファ転送が発生します。

ケース 2:
Propagate_on_container_move_assignment は false ですが、アロケーターは等しいです。

ケース 1 と同様に、moved- from Vector は空です。

ケース 3:
Propagate_on_container_move_assignment が false で、アロケーターが等しくありません。

リソースを直接転送することは不可能です。代わりに、要素を個別に移動する必要があります。移動元ベクトルに移動コンストラクターのない要素が含まれている場合、それは空ではないままになります。ただし、標準では必須ではありませんが、実装ではオプションで v.clear() を呼び出して空にすることができます。

以上が移動元の `std::vector` は常に空ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。