C++ 具名要求:可移动插入 (MoveInsertable) (C++11 起)

来自cppreference.com
< cpp‎ | named req


 
 
C++ 具名要求
 

指定该类型的对象能以给定的分配器,从一个该类型的右值构造到未初始化存储之中。

目录

[编辑] 要求

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

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

如果满足以下所有条件,那么 T 可复制插入 (CopyInsertable) X 中:

  • expr 良构。
  • 在对 expr 求值完成时,*p 的值等价于 rv 在这次求值前的值。

[编辑] 注解

如果 Astd::allocator<T>,那么就会如同用 ::new((void*)p) T(rv)(C++20 前)std::construct_at(p, rv)(C++20 起) 调用布置 new。这相当于要求 T 可移动构造。

如果使用了 std::allocator<T> 或类似的分配器,那么该类不必为满足此类型要求而实现移动构造函数:接收 const T& 实参的复制构造函数能绑定右值表达式。如果可移动插入 (MoveInsertable) 的类实现了移动构造函数,那么它可能亦实现移动语义以利用“构造后 rv 的值未指明”的事实。

尽管 C++23 前要求在构造 std::basic_string 的元素时使用定制的 construct,但所有实现都使用默认机制。P1072R10 更正了该要求以匹配既存实践。

[编辑] 缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 2177 C++11 expr 进行求值没有任何后条件 添加后条件

[编辑] 参阅

可复制插入 (CopyInsertable)