std::array是否可 move ?

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

快速浏览gcc 4.8库源代码似乎可以确认std::array是不可 move 的:

std::vector:

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

而在std::array中,唯一接收右值引用参数的方法是随机元素访问,这避免了复制返回:
get(array<_Tp, _Nm>&& __arr) noexcept
    { /*...*/ return std::move(get<_Int>(__arr)); }

是否默认创建了std::array的 move 构造函数和 move 分配,或者std::array是不可 move 的?如果无法 move ,为什么std::array不能 move 而std::vector不能 move ?

最佳答案

std::array仅在其包含的对象可 move 时才可 move 。
std::array与其他容器完全不同,因为容器对象包含存储空间,而不仅仅是指向堆的指针。 move std::vector仅复制一些指针,并且所包含的对象都不是更明智的选择。

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

09-10 04:29
查看更多