移动构造函数和 'std::array'
Move constructors and `std::array`
根据 N3485 §23.3.2.2:
(...( 数组的隐式移动构造函数和移动赋值运算符分别要求 T 为 MoveConstructible 或 MoveAssignable。
因此,如果元素的类型支持移动语义,std::array
支持移动语义。伟大!
然而,这到底意味着什么?我倾向于将这种类型描述为提供符合 STL 的接口的数组的更安全版本,但如果这是真的,那么std::array
如何移动构造其元素?我可以对普通数组执行相同的操作吗?
这意味着,如果元素类型是可移动的然而,这到底意味着什么?
,那么数组类型也是可移动的。
std::array<movable, 42> move_from = {...};
std::array<movable, 42> move_to = std::move(move_from); // moves all the elements
我倾向于将这种类型想象为提供符合 STL 的接口的更安全的阵列版本
没有。它是数组的包装器,赋予它与聚合类相同的语义 - 包括复制和移动它的能力。
一个
std::array
如何移动构建它的元素?
与任何其他聚合完全相同。它的隐式移动构造函数将移动构造其所有成员,包括任何成员数组的元素。
我可以对普通数组执行相同的操作吗?
仅当您像std::array
那样将其包装在类类型中时。
移动std::array
不同于移动std::vector
。当将一个std::vector
移动到另一个时,(有时*(可以简单地重新定位内部指针并完全避免操作元素。
使用 std::array
,这当然是不可能的 - 它的元素具有自动存储持续时间,它们实际上包含在对象中。但是,它们中的每一个仍然可以移动,这就是std::array
上的移动操作的作用**。
* 假设分配器兼容并且不禁止此操作
** 当缓冲区不能仅由目标向量重新拥有时,这也是您在std::vector
得到的。
(非联合(类的默认移动构造函数执行成员级移动。移动原始数组数据成员意味着移动数组的每个元素,请参阅 [class.copy]/15。
因此,您可以通过将原始数组放入类中来移动它:
struct wrap
{
std::string arr[25];
};
auto w = wrap();
auto m = std::move(w); // moves the 25 `std::string`s
您还可以手动调用元素的移动构造函数,例如:
std::string a[3] = { /*...*/ };
std::string b[3] = {std::move(a[0]), std::move(a[1]), std::move(a[2])};
如果std::array
包含原始数组,则未指定。但是,它确实包含value_type
的数据成员,因为它保证是一个聚合。调用 move 构造函数时,将如上所述移动这些数据成员。
如果std::array
的数据成员不是 MoveConstructible,则实例化其移动构造函数将失败。
"放置new
"来做到这一点。 您会发现很多关于安置的问题 新 已经回答了许多更多详细信息。
这个看起来有一个完整的示例:
- 为什么这段代码试图调用复制构造函数?
- "error: no matching function for call to"构造函数错误
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 无法推断类中的类型,构造函数采用 std::array
- C++如何在类构造函数中实例化 std::array?
- 我正在使用dev c ++,但收到错误(C++98'array'必须由构造函数初始化)
- 当 T 不可默认构造时,构造函数初始值设定项列表中 std::array<T,N> 的初始化
- 在构造函数中初始化私有 std::array 成员
- 为什么span的数组和std::array构造函数与其容器构造函数不同
- Picky STD :: String Char Array构造函数
- 简化冗余std :: array初始化,当时没有constexpr构造函数
- 无法创建将 std::array<T, n> 作为类成员的构造函数
- 使用字符串文本初始化构造函数中的 std::array<char,x> 成员。海湾合作委员会错误?
- ARRAY[T, SIZE]合适的默认构造函数可用
- 如何为 std::array 的列表初始化构造函数编写包装器?
- 为什么std::array不包含初始化列表构造函数
- 对std::array中的元素调用用户定义的构造函数
- 初始化的Array构造函数做什么?
- 将参数传递给容器构造函数"array-like"
- 在类的构造函数初始值设定项中填充 std::array
- 移动构造函数和 'std::array'