C++ 命名要求: DefaultInsertable (自 C++11 起)
指定该类型的实例可以通过给定分配器进行原地默认构造。
要求
如果给定以下条件,类型 T 是 DefaultInsertable 到 Container X 中,其 value_type 与 T 相同:
A
分配器类型m
A
类型的左值p
是容器准备的类型为T*
的指针,其中 X::allocator_type 与std::allocator_traits<A>::rebind_alloc<T>
相同,
以下表达式格式良好
std::allocator_traits<A>::construct(m, p);
如果 X 不是分配器感知型或是一个 std::basic_string 特化,则该术语的定义如同 A 是 std::allocator<T>,只是不需要创建分配器对象,并且不会实例化用户定义的 std::allocator 特化。
备注
默认情况下,这将通过 ::new((void*)p) T()
(直到 C++20) std::construct_at(p)
(自 C++20 起) 对对象进行值初始化。如果值初始化不合需要,例如,如果对象是非类类型且不需要清零,则可以通过提供自定义的 Allocator::construct 来避免。
尽管在 C++23 之前,要求在构造 std::basic_string 的元素时使用自定义构造,但所有实现都只使用了默认机制。此要求已通过 P1072R10 进行纠正,以符合现有实践。