C++ named requirements: MoveInsertable (since C++11)
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
指定该类型的对象可以通过给定的分配器从该类型的右值构造到未初始化的存储中。
目录 |
要求
给定以下类型、值和表达式:
| 类型 | 定义 |
T
|
对象类型 |
A
|
分配器类型 |
X
|
满足以下所有条件的容器类型:
|
| 值 | 定义 |
| m |
类型为
A
的左值
|
| p |
类型为
T*
的指针
|
| 表达式 | 定义 |
| rv |
表示类型为
T
的右值的表达式
|
| expr | std:: allocator_traits < A > :: construct ( m, p, rv ) |
T
是
MoveInsertable
到
X
中的,当满足以下所有条件时:
- expr 格式正确。
- 在 expr 求值后, * p 的值等同于求值前 rv 的值。
注释
如果
A
是
std::
allocator
<
T
>
,那么这将调用布置
new
,如
::
new
(
(
void
*
)
p
)
T
(
rv
)
(C++20 前)
std::
construct_at
(
p, rv
)
(C++20 起)
所示。这实际上要求
T
必须是可移动构造的。
如果使用
std::
allocator
<
T
>
或类似分配器,类无需实现
移动构造函数
即可满足此类型要求:接受
const
T
&
参数的
拷贝构造函数
可以绑定右值表达式。若
MoveInsertable
类实现了移动构造函数,则还可实现
移动语义
以利用构造后
rv
值未指定的特性。
尽管在 C++23 之前要求构造
std::basic_string
元素时必须使用自定义的
construct
,但所有实现都仅使用了默认机制。该要求已通过
P1072R10
修正以符合现有实践。
缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的C++标准。
| 缺陷报告 | 适用范围 | 发布时行为 | 正确行为 |
|---|---|---|---|
| LWG 2177 | C++11 | 对 expr 求值没有任何后置条件 | 已添加 |
另请参阅
| 可复制插入 |