std::pmr::polymorphic_allocator::construct

template < class U, class... Args >
void construct( U* p, Args&&... args );
(1) (C++17 起)
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) (C++17 起)
template< class T1, class T2 >
void construct( std::pair<T1, T2>* p );
(3) (C++17 起)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, U&& x, V&& y );
(4) (C++17 起)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, const std::pair<U, V>& xy );
(5) (C++17 起)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, std::pair<U, V>&& xy );
(6) (C++17 起)

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 的 tuple 以包含 this->resource() ,产生二个新 tuple xprimeyprime ,按照下列规则:

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 ),则 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 ,就如同以用 ::new((void *) p) pair<T1, T2>(std::piecewise_construct, std::move(xprime), std::move(yprime)); 于分配的存储构造 pair p

3) 等价于 construct(p, std::piecewise_construct, std::tuple<>(), std::tuple<>()) ,即传递memory_resouce 到 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::allocator_traits ),例如 std::pmr::vector (或另一个给定了 std::std::polymorphic_allocator 作为所用分配器的 std::vector )。因为 memory_resource* 隐式转换到 polymorphic_allocator , memory_resource 指针将传播给任何使用多态分配器的具分配器子对象。

参阅

[静态]
在分配的存储构造对象
(函数模板)
(C++17 中弃用)
在分配的存储构造对象
(std::allocator 的公开成员函数)

版本历史

  • (当前 | 先前 2017年5月4日 (四) 09:33Fruderica讨论 | 贡献. . (5,410字节) (+4,463). . (撤销)
  • 当前 | 先前) 2017年5月4日 (四) 09:11Fruderica讨论 | 贡献. . (947字节) (+947). . (以“{{cpp/memory/pmr/title|operator{{==}}|operator!{{=}}}} {{cpp/memory/polymorphic_allocator/navbar}} {{dcl begin}} {{dcl | 1= template< class T1, class T2 > bool opera...”为内容创建页面)