命名空间
变体
操作

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

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

指定可以使用给定分配器将该类型的对象构造到未初始化的存储区中,该对象来自该类型的右值。

[编辑] 要求

如果给定,则类型 T 可以 MoveInsertableX 容器中,其 value_typeT 相同:

一个 分配器类型
m A 类型的左值
p 容器准备的 T* 类型的指针
rv T 类型的右值表达式

其中 X::allocator_typestd::allocator_traits<A>::rebind_alloc<T> 相同,

以下表达式是格式良好的

std::allocator_traits<A>::construct(m, p, rv);

并且在评估之后,*p 的值等效于 rv 之前持有的值(rv 仍然有效,但处于未指定状态)。

如果 X 不是分配器感知的容器或是一个 std::basic_string 特化,则此术语的定义如同 Astd::allocator<T> 一样,但无需创建分配器对象,也不会实例化 std::allocator 的用户定义特化。

[编辑] 注释

如果 Astd::allocator<T>,那么这将调用放置 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 纠正,以匹配现有做法。

[编辑] 另请参阅

CopyInsertable