Namespaces
Variants

C++ named requirements: CopyInsertable (since C++11)

From cppreference.net
C++ named requirements

指定该类型的对象可以通过给定的分配器进行原地复制构造。

要求

给定以下类型、值和表达式:

类型 定义
T 对象类型
A 分配器类型
X 满足以下所有条件的容器类型:
定义
m 类型为 A 的左值
p 类型为 T* 的指针
表达式 定义
v 表示类型为 T / const T 的左值,或类型为 const T 的右值的表达式
expr std:: allocator_traits < A > :: construct ( m, p, v )

T 可复制插入 X 的,当且仅当满足以下所有条件:

  • T 移动插入 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++标准。

缺陷报告 应用于 发布时的行为 正确行为
LWG 2177 C++11 求值 expr 没有任何后置条件 已添加
LWG 3957 C++11 v 可能表示类型 T 的右值 已排除