web-dev-qa-db-ja.com

std :: arrayは移動可能ですか?

std :: arrayは移動可能ですか?

Bjarne Native 2012プレゼンテーションスライド (スライド41)では、移動できない唯一のコンテナーの1つとしてstd::arrayがリストされています。

Gcc 4.8ライブラリのソースコードをざっと見てみると、std::arrayは移動できないことが確認できます。

std :: vector:

/* @brief  %Vector move constructor.
   ...       */
  vector(vector&& __x) noexcept
  : _Base(std::move(__x)) { }

std :: array内では、右辺値参照パラメーターを受け取る唯一のメソッドはランダム要素アクセスであり、コピーによる戻りを回避します。

get(array<_Tp, _Nm>&& __arr) noexcept
    { /*...*/ return std::move(get<_Int>(__arr)); }

std::arrayのmove-constructorとmove-assignmentはデフォルトで作成されますか、それともstd::arrayは移動できませんか?移動できない場合、std::arrayは移動できるのにstd::vectorは移動できないのはなぜですか?

37

std::arrayは、含まれているオブジェクトが移動可能な場合にのみ移動できます。

std::arrayは、ヒープへのポインターだけでなく、コンテナーオブジェクトにストレージが含まれているため、他のコンテナーとはかなり異なります。 std::vectorを移動すると、一部のポインタのみがコピーされ、含まれるオブジェクトは賢くなりません。

はい、std::arrayはデフォルトの移動コンストラクタと代入演算子を使用します。集約クラスとして、コンストラクターを定義することはできません。

49
Potatoswatter