C++ 具名要求:可移动插入 (MoveInsertable) (C++11 起)
来自cppreference.com
指定该类型的对象能以给定的分配器,从一个该类型的右值构造到未初始化存储之中。
目录 |
[编辑] 要求
给定以下类型、值和表达式:
类型 | 定义 |
T
|
对象类型 |
A
|
分配器类型 |
X
|
满足以下所有条件的容器类型:
|
值 | 定义 |
m | A 类型左值
|
p | T* 类型指针
|
表达式 | 定义 |
rv | 表示 T 类型右值的表达式
|
expr | std::allocator_traits<A>::construct(m, p, rv) |
如果满足以下所有条件,那么 T
可复制插入 (CopyInsertable) 到 X
中:
- expr 良构。
- 在对 expr 求值完成时,*p 的值等价于 rv 在这次求值前的值。
[编辑] 注解
如果 A
是 std::allocator<T>,那么就会如同用 ::new((void*)p) T(rv)(C++20 前)std::construct_at(p, rv)(C++20 起) 调用布置 new。这相当于要求 T
可移动构造。
如果使用了 std::allocator<T> 或类似的分配器,那么该类不必为满足此类型要求而实现移动构造函数:接收 const T& 实参的复制构造函数能绑定右值表达式。如果可移动插入 (MoveInsertable) 的类实现了移动构造函数,那么它可能亦实现移动语义以利用“构造后 rv 的值未指明”的事实。
尽管 C++23 前要求在构造 std::basic_string 的元素时使用定制的 construct
,但所有实现都使用默认机制。P1072R10 更正了该要求以匹配既存实践。
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2177 | C++11 | 对 expr 进行求值没有任何后条件 | 添加后条件 |
[编辑] 参阅
可复制插入 (CopyInsertable) |