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
は移動できないのはなぜですか?
std::array
は、含まれているオブジェクトが移動可能な場合にのみ移動できます。
std::array
は、ヒープへのポインターだけでなく、コンテナーオブジェクトにストレージが含まれているため、他のコンテナーとはかなり異なります。 std::vector
を移動すると、一部のポインタのみがコピーされ、含まれるオブジェクトは賢くなりません。
はい、std::array
はデフォルトの移動コンストラクタと代入演算子を使用します。集約クラスとして、コンストラクターを定義することはできません。