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
?
答案 0 :(得分:43)
std::array
只有在其包含的对象可移动时才可移动。
std::array
与其他容器完全不同,因为容器对象包含存储,而不仅仅是指向堆的指针。移动std::vector
仅复制一些指针,并且包含的对象不是更明智的。
是的,std::array
使用默认的移动构造函数和赋值运算符。作为聚合类,不允许定义任何构造函数。