跳到主要内容

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

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

要求

类型 TMoveInsertable 到容器 X 中,如果其 value_type 与 T 相同,并且给定

  • A 分配器类型
  • 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 的用户定义特化。

备注

如果 A 是 std::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 的元素时使用自定义构造,但所有实现都只使用了默认机制。此要求已通过 P1072R10 进行修正,以符合现有实践。

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

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

要求

类型 TMoveInsertable 到容器 X 中,如果其 value_type 与 T 相同,并且给定

  • A 分配器类型
  • 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 的用户定义特化。

备注

如果 A 是 std::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 的元素时使用自定义构造,但所有实现都只使用了默认机制。此要求已通过 P1072R10 进行修正,以符合现有实践。