std :: array是否可以移动?

时间:2013-01-17 01:17:50

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

std :: array是否可以移动?

Bjarne Native 2012 presentation slides(幻灯片41)中,它将std::array列为唯一不可移动的容器之一。

快速浏览gcc 4.8库源代码似乎确认std::array不可移动:

的std ::矢量:

/* @brief  %Vector move constructor.
   ...       */
  vector(vector&& __x) noexcept
  : _Base(std::move(__x)) { }

在std :: array中,接收rvalue引用参数的唯一方法是随机元素访问,这样可以避免通过副本返回:

get(array<_Tp, _Nm>&& __arr) noexcept
    { /*...*/ return std::move(get<_Int>(__arr)); }

std::array默认创建的移动构造函数和移动分配,还是std::array不可移动?如果它不可移动,为什么在std::array可以移动时无法移动std::vector

1 个答案:

答案 0 :(得分:43)

std::array只有在其包含的对象可移动时才可移动。

std::array与其他容器完全不同,因为容器对象包含存储,而不仅仅是指向堆的指针。移动std::vector仅复制一些指针,并且包含的​​对象不是更明智的。

是的,std::array使用默认的移动构造函数和赋值运算符。作为聚合类,不允许定义任何构造函数。