命名空间
变体
操作

std::experimental::pmr::polymorphic_allocator<T>::construct

来自 cppreference.com
 
 
 
 
 
template< class U, class... Args >
void construct( U* p, Args&&... args );
(1) (库基础 TS)
template< class T1, class T2, class... Args1, class... Args2 >

void construct( std::pair<T1, T2>* p,
                std::piecewise_construct_t,
                std::tuple<Args1...> x,

                std::tuple<Args2...> y );
(2) (库基础 TS)
template< class T1, class T2 >
void construct( std::pair<T1, T2>* p );
(3) (库基础 TS)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, U&& x, V&& y );
(4) (库基础 TS)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, const std::pair<U, V>& xy );
(5) (库基础 TS)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, std::pair<U, V>&& xy );
(6) (库基础 TS)

使用提供的构造函数参数在分配但未初始化的存储空间中构造一个对象,该存储空间由p指向。如果该对象是本身使用分配器的类型,或者它是 std::pair,则将 this->resource() 传递给构造的对象。

1) 如果std::uses_allocator<U, memory_resource*>::value == false (类型 U 不使用分配器)并且 std::is_constructible<U, Args...>::value == true,则构造该对象,就像使用::new((void *) p) U(std::forward<Args>(args)...);一样。

否则,如果std::uses_allocator<U, memory_resource*>::value == true (类型 U 使用分配器,例如它是一个容器)并且 std::is_constructible<U, std::allocator_arg_t, memory_resource*, Args...>::value == true,则构造该对象,就像使用::new((void *) p) U(std::allocator_arg, this->resource(), std::forward<Args>(args)...);一样。

否则,如果std::uses_allocator<U, memory_resource*>::value == true (类型 U 使用分配器,例如它是一个容器)并且 std::is_constructible<U, Args..., memory_resource*>::value == true,则构造该对象,就像使用::new((void *) p) U(std::forward<Args>(args)..., this->resource());一样。

否则,程序格式错误。

2) 首先,如果 T1T2 是分配器感知的,则根据以下三个规则修改元组 xy 以包含 this->resource(),从而生成两个新的元组 xprimeyprime

2a) 如果 T1 不是分配器感知的 (std::uses_allocator<T1, memory_resource*>::value == false) 并且 std::is_constructible<T1, Args1...>::value == true,则 xprimex,未修改。

2b) 如果 T1 是分配器感知的 (std::uses_allocator<T1, memory_resource*>::value == true),并且它的构造函数接受分配器标记 (std::is_constructible<T1, std::allocator_arg_t, memory_resource*, Args1...>::value == true,则 xprimestd::tuple_cat(std::make_tuple(std::allocator_arg, this->resource()), std::move(x)).

2c) 如果 T1 是分配器感知的 (std::uses_allocator<T1, memory_resource*>::value == true), 并且它的构造函数将分配器作为最后一个参数 (std::is_constructible<T1, Args1..., memory_resource*>::value == true), 那么 xprimestd::tuple_cat(std::move(x), std::make_tuple(this->resource())).

2d) 否则,程序是非法的。

相同规则适用于 T2 和用 yprime 替换 y

一旦 xprimeyprime 被构造,就使用分配的存储空间构造 pair p,如同使用 ::new((void *) p) pair<T1, T2>(std::piecewise_construct, std::move(xprime), std::move(yprime));.

3) 等效于 construct(p, std::piecewise_construct, std::tuple<>(), std::tuple<>()), 也就是说,如果 pair 的成员类型接受内存资源,则将内存资源传递给它们。

4) 等效于

construct(p, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(x)),
                                       std::forward_as_tuple(std::forward<V>(y)))

5) 等效于

construct(p, std::piecewise_construct, std::forward_as_tuple(xy.first),
                                       std::forward_as_tuple(xy.second))

6) 等效于

construct(p, std::piecewise_construct, std::forward_as_tuple(std::forward<U>(xy.first)),
                                       std::forward_as_tuple(std::forward<V>(xy.second)))

内容

[编辑] 参数

p - 指向分配但未初始化的存储空间的指针
args... - 传递给 T 的构造函数的构造函数参数
x - 传递给 T1 的构造函数的构造函数参数
y - 传递给 T2 的构造函数的构造函数参数
xy - 其两个成员是 T1T2 的构造函数参数的 pair

[编辑] 返回值

(无)

[编辑] 备注

此函数由任何分配器感知的对象(如 std::vector)调用(通过 std::allocator_traits),这些对象被赋予了 std::polymorphic_allocator 作为要使用的分配器。由于 memory_resource* 隐式转换为 polymorphic_allocator,因此内存资源指针将传播到使用多态分配器的任何分配器感知子对象。

[编辑] 参见

[static]
在分配的存储空间中构造对象
(函数模板) [编辑]
(直到 C++20)
在分配的存储空间中构造对象
(std::allocator<T> 的公共成员函数) [编辑]