C++ 具名要求:可移动插入 (MoveInsertable) (C++11 起)
基础 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
类型属性 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
库所属 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
容器 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
容器元素 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
迭代器 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
流 I/O | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
格式化 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
随机数 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
并发 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
范围 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
其他 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
|
指定该类型的对象能以给定的分配器,从一个该类型的右值构造到未初始化存储之中。
要求
以下情况下,类型 T
可移动插入 (MoveInsertable)
进容器 X
(其 value_type
等同于
T
):给定
A
|
分配器类型 |
m
|
A 类型的左值
|
p
|
容器所准备的 T* 类型的指针
|
rv
|
T 类型的右值表达式
|
其中 X::allocator_type
等同于 std::allocator_traits<A>::rebind_alloc<T>,
下列表达式为良构:
std::allocator_traits<A>::construct(m, p, rv);
并且求值后,*p
的值等价于 rv
先前保有的值(rv
保持有效,但处于未指明的状态)。
若 X
非知分配器或为 std::basic_string
特化,则如同 A
就是 std::allocator<T>
一样进行定义,但并不需要创建分配器对象,且不会实例化用户定义的 std::allocator
的特化。
注解
若 A
为 std::allocator<T>,则这将调用布置
new,如同用 ::new((void*)p) T(rv)
(C++20
前)std::construct_at(p, rv)
(C++20
起)。
若使用了 std::allocator<T>
或类似的分配器,则该类不必为满足此类型要求而实现移动构造函数:接收
const T&
实参的复制构造函数能绑定右值表达式。若可移动插入 (MoveInsertable)
的类实现了移动构造函数,则它可能亦实现移动语义以利用“构造后 rv
的值未指明”的事实。
尽管 C++23 前要求在构造 std::basic_string
的元素时使用定制的 construct
,所有实现都使用默认机制。P1072R10 更正了该要求以匹配既存实现。
参阅
可复制插入 (CopyInsertable) |