49

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

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

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か?

4

1 に答える 1

64

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

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

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

于 2013-01-17T01:20:13.040 に答える