移动无法在std :: array上有效实现(O(1)),那为什么它有移动构造函数?
答案 0 :(得分:28)
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
应该有一个移动复制构造函数,特别是因为它是免费的。没有人会要求它被积极禁用,我看不出任何好处。
答案 1 :(得分:23)
总结并扩展其他答案时,array<T>
应该是可移动的(当T
本身可移动时),因为:
T
可以有效移动。T
可能只会移动 。答案 2 :(得分:0)
看看标准:
23.3.2.2数组构造函数,复制和赋值[array.cons]
应满足总量(8.5.1)的条件。类数组 依赖于隐式声明的特殊成员函数(12.1, 12.4和12.8)符合23.2中的容器要求表。除了容器需求表中指定的要求外,隐式移动构造函数和移动赋值 operator for array要求T是MoveConstructible或 分别是MoveAssignable。
移动构造函数和赋值运算符到目前为止不是免费的,它们可能不会被提供。