C++ 命名需求: CopyInsertable (自 C++11 起)
来自 cppreference.com
指定类型的实例可以通过给定的分配器原地复制构造。
[编辑] 需求
给定以下类型、值和表达式
类型 | 定义 |
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
中
- expr 有效。
- 评估 expr 不会改变 v 的值。
- 在评估 expr 之后,v 的值等效于 *p。
[编辑] 注释
如果 A
是 std::allocator<T>,则这将调用就地 new,如 ::new((void*)p) T(v)(直到 C++20)std::construct_at(p, v)(自 C++20 起) 所示。
虽然在 C++23 之前,在构造 std::basic_string 元素时,需要使用自定义的 construct
,但所有实现都只使用了默认机制。该需求已由 P1072R10 修正,以匹配现有的实践。
[编辑] 缺陷报告
以下行为更改缺陷报告已追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 3957 | C++11 | v 可以表示类型为 T 的右值 |
已排除 |