C++ 命名要求: CopyInsertable (自 C++11 起)
来自 cppreference.cn
指定给定分配器可以在原地复制构造类型对象。
[编辑] 要求
给定以下类型、值和表达式
类型 | 定义 |
T
|
一个对象类型 |
A
|
一个分配器类型 |
X
|
一个满足以下所有条件的容器类型
|
值 | 定义 |
m | 一个类型为 A 的左值 |
p | 一个类型为 T* 的指针 |
表达式 | 定义 |
v | 表示类型 T / const T 的左值,或类型 const T 的右值的表达式 |
expr | std::allocator_traits<A>::construct(m, p, v) |
如果满足所有以下条件,则 T
可 CopyInsertable 到 X
中:
-
T
可 MoveInsertable 到X
中。 - expr 形式良好。
- 评估 expr 不会改变 v 的值。
- 评估 expr 后,v 的值等同于 *p。
[编辑] 注意
如果 A
是 std::allocator<T>,则这将调用 placement new,如 ::new((void*)p) T(v)(直至 C++20)std::construct_at(p, v)(自 C++20 起)。
尽管要求在 C++23 之前构造 std::basic_string 的元素时使用定制的 construct
,但所有实现都只使用了默认机制。此要求已通过 P1072R10 纠正以符合现有实践。
[编辑] 缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 2177 | C++11 | 评估 expr 没有任何后置条件 | 已添加 |
LWG 3957 | C++11 | v 可以表示类型 T 的右值 |
已排除 |