49

std::array 是可移动的吗?

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

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

标准::向量:

/* @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默认创建的移动构造函数和移动分配,还是std::array不可移动的?如果它是不可移动的,为什么std::array不能移动而std::vector可以移动?

4

1 回答 1

64

std::array仅当其包含的对象是可移动的时,它才是可移动的。

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

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

于 2013-01-17T01:20:13.040 回答