在 std::array 上不能有效地实现移动(O(1)),那么为什么它有移动构造函数呢?
问问题
3755 次
3 回答
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
应该有一个移动复制构造函数,特别是因为它是免费的。没有一个需要它被主动禁用,我看不出有什么好处。
于 2013-08-07T13:54:19.940 回答
23
总结和扩展其他答案,array<T>
应该是可移动的(当T
它本身是可移动的),因为:
T
可以有效地移动。T
可能是只能移动的。
于 2013-08-07T22:59:34.430 回答
0
看看标准:
23.3.2.2 数组构造函数、复制和赋值 [array.cons]
应满足骨料 (8.5.1) 的条件。类数组依赖于隐式声明的特殊成员函数(12.1、12.4 和 12.8)以符合 23.2 中的容器要求表。除了容器要求表中指定的要求外,数组的隐式移动构造函数和移动赋值运算符要求 T 分别为 MoveConstructible 或 MoveAssignable。
移动构造函数和赋值运算符到目前为止还不是免费的,它们可能没有提供。
于 2013-08-07T14:10:06.727 回答