命名空间
变体
操作

C++ 命名要求: MoveInsertable (自 C++11 起)

来自 cppreference.cn
 
 
C++ 命名要求
 

指定可通过给定的分配器,从该类型的右值将该类型的对象构造到未初始化的存储中。

目录

[编辑] 要求

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

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

如果满足以下所有条件,则 TMoveInsertableX

  • expr 是良构的。
  • expr 求值之后,*p 的值等价于求值之前 rv 的值。

[编辑] 注释

如果 Astd::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++ 标准。

DR 应用于 已发布行为 正确行为
LWG 2177 C++11 评估 expr 没有后置条件 已添加

[编辑] 参见

CopyInsertable