std :: array应该有移动构造函数吗?

时间:2013-08-07 13:46:13

标签: c++ c++11 move-semantics

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

3 个答案:

答案 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。

移动构造函数和赋值运算符到目前为止不是免费的,它们可能不会被提供。