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构造函数和赋值运算符。作为聚合类,不允许定义任何构造函数。