std::experimental::pmr::polymorphic_allocator<T>::construct
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, |
(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) |
(5) | (库基础 TS) | |
(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) 首先,如果 T1
或 T2
知分配器,则根据以下三条规则,修改元组 x 和 y 以包括 this->resource()
,得到两个元组 xprime
和 yprime
:
2a) 如果 T1
并非知分配器(std::uses_allocator<T1, memory_resource*>::value == false)且 std::is_constructible<T1, Args1...>::value == true,则 xprime
为未修改的 x。
2b) 如果 T1
知分配器(std::uses_allocator<T1, memory_resource*>::value == true),且其构造函数接受分配器标签(std::is_constructible<T1, std::allocator_arg_t, memory_resource*, Args1...>::value == true),则 xprime
为
std::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),则 xprime
为 std::tuple_cat(std::move(x), std::make_tuple(this->resource()))。
2d) 否则,程序非良构。
相同的规则适用于 T2
并以 yprime
替代 y。
一旦构造了 xprime
和 yprime
,则如同以 ::new((void *) p) pair<T1, T2>(std::piecewise_construct, std::move(xprime), std::move(yprime)); 在所分配存储中构造对偶 p。
3) 等价于 construct(p, std::piecewise_construct, std::tuple<>(), std::tuple<>()),即如果对偶的成员类型接受,则向它们传递内存资源。
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 | - | 两个成员分别为 T1 和 T2 的构造函数实参的对偶
|
返回值
(无)
注解
此函数由任何给定 std::polymorphic_allocator 为所用的分配器的知分配器对象(如 std::vector)所调用。由于 memory_resource*
隐式转换为 polymorphic_allocator
,因此内存资源指针将会使用多态分配器传播给任何知分配器子对象。
参阅
[静态] |
在已分配存储中构造对象 (函数模板) |
(C++20 前) |
在分配的存储中构造对象 ( std::allocator<T> 的公开成员函数) |