20

在 std::array 上不能有效地实现移动(O(1)),那么为什么它有移动构造函数呢?

4

3 回答 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 回答