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

Łuk*_*Lew 20 c++ move-semantics c++11

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

jua*_*nza 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);
}
Run Code Online (Sandbox Code Playgroud)

所以我想说std::array应该有一个移动复制构造函数,特别是因为它是免费的.没有人会要求它被积极禁用,我看不出任何好处.

  • @MarkB:"*它是否需要元素移动构造函数不是?*"它是一个编译器生成的移动构造函数,因此它适用于它给出的任何内容.如果底层类型是"noexcept"可移动,那么生成的移动构造函数也是如此.如果不是,那么生成的那个也不会. (3认同)

Her*_*ter 23

总结和扩展其他答案,array<T>应该是可移动的(当T它本身是可移动的)时,因为:

  • T 可以有效地移动.
  • T可MOVE- .