std::array では移動を効率的に (O(1)) 実装できないのに、なぜ move コンストラクターがあるのでしょうか?
3 に答える
std::array
あるインスタンスのすべての要素を別のインスタンスに移動できるようにするコンパイラ生成の移動コンストラクタがあります。これは、要素が効率的に移動可能である場合、または移動のみ可能である場合に便利です。
#include <array>
#include <iostream>
struct Foo
{
Foo()=default;
Foo(Foo&&)
{
std::cout << "Foo(Foo&&)\n";
}
Foo& operator=(Foo&&)
{
std::cout << "operator=(Foo&&)\n";
return *this;
}
};
int main()
{
std::array<Foo, 10> a;
std::array<Foo, 10> b = std::move(a);
}
std::array
したがって、特に無料で提供されるため、ムーブ コピー コンストラクターが必要であると言えます。持っていない場合は、アクティブに無効にする必要があり、それには何のメリットもありません。
他の回答を要約して拡張するには、移動可能にarray<T>
する必要があります (T
それ自体が移動可能な場合)。
T
効率よく動けるかもしれません。T
移動のみの場合があります。
標準を見てください:
23.3.2.2 配列コンストラクタ、コピー、代入 [array.cons]
集合体の条件 (8.5.1) が満たされなければならない。クラス配列は、23.2 のコンテナー要件テーブルに準拠するために、暗黙的に宣言された特別なメンバー関数 (12.1、12.4、および 12.8) に依存しています。コンテナー要件表で指定された要件に加えて、配列の暗黙的な移動コンストラクターと移動代入演算子では、T がそれぞれ MoveConstructible または MoveAssignable である必要があります。
ムーブ コンストラクターと代入演算子は自由ではなく、提供されていない可能性があります。