C++ 命名要求: MoveInsertable (C++11 起)
来自 cppreference.cn
指定给定分配器可将该类型的对象从该类型的右值构造到未初始化的存储中。
目录 |
[编辑] 要求
给定以下类型、值和表达式
类型 | 定义 |
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>,则这将调用 placement 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 没有后置条件 | 已添加 |
[编辑] 参阅
CopyInsertable(可复制插入) |