命名空间
变体
操作

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

来自 cppreference.cn
 
 
内存管理库
(仅为解释用途*)
未初始化内存算法
(C++17)
(C++17)
(C++17)
受约束的未初始化
内存算法
C 库

分配器
内存资源
垃圾回收支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
未初始化存储
(直到 C++20*)
(直到 C++20*)
显式生命周期管理
 
 
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 起)
(直到 C++20)
template< class T1, class T2 >
void construct( std::pair<T1, T2>* p );
(3) (自 C++17 起)
(直到 C++20)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, U&& x, V&& y );
(4) (自 C++17 起)
(直到 C++20)
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 起)
(直到 C++20)
template< class T1, class T2, class U, class V >
void construct( std::pair<T1, T2>* p, std::pair<U, V>&& xy );
(6) (自 C++17 起)
(直到 C++20)
template< class T1, class T2, class NonPair >
void construct( std::pair<T1, T2>* p, NonPair&& non_pair );
(7) (自 C++17 起)
(直到 C++20)

p 指向的已分配但未初始化的存储中,使用提供的构造函数实参构造对象。如果对象本身的类型使用了分配器,或者它是 std::pair,则将 *this 传递给构造的对象。

1) 通过使用分配器的构造,在 p 指示的未初始化内存位置创建给定类型 U 的对象,并使用 *this 作为分配器。仅当 U 不是 std::pair 的特化时,此重载才参与重载决议。(直到 C++20)
2) 首先,如果 T1T2 中的任何一个是 allocator-aware,则根据以下三个规则修改元组 xy 以包含 this->resource(),从而得到两个新的元组 xprimeyprime
2a) 如果 T1 不是 allocator-aware ( std::uses_allocator<T1, polymorphic_allocator>::value==false ) 且 std::is_constructible<T1, Args1...>::value==true,则 xprime 是未修改的 x
2b) 如果 T1 是 allocator-aware ( std::uses_allocator<T1, polymorphic_allocator>::value==true ),并且其构造函数接受分配器标签 ( std::is_constructible<T1, std::allocator_arg_t, polymorphic_allocator, Args1...>::value==true ),则 xprimestd::tuple_cat(std::make_tuple(std::allocator_arg, *this), std::move(x))
2c) 如果 T1 是 allocator-aware ( std::uses_allocator<T1, polymorphic_allocator>::value==true ),并且其构造函数将分配器作为最后一个参数 ( std::is_constructible<T1, Args1..., polymorphic_allocator>::value==true ),则 xprimestd::tuple_cat(std::move(x), std::make_tuple(*this))
2d) 否则,程序是非良构的。
相同的规则适用于 T2 以及将 y 替换为 yprime
一旦构造了 xprimeyprime,就像通过 ::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<>()),即,如果 pair 的成员类型接受内存资源,则将内存资源传递给它们。
5) 等价于
6) 等价于
7) 仅当给定仅用于解释的函数模板时,此重载才参与重载决议
template< class A, class B >
void /*deduce-as-pair*/( const std::pair<A, B>& );

,当 /*deduce-as-pair*/(non_pair) 作为未求值操作数考虑时,为非良构。等价于

construct<T1, T2, T1, T2>(p, std::forward<NonPair>(non_pair));
(直到 C++20)

目录

[编辑] 参数

p - 指向已分配但未初始化的存储的指针
args... - 要传递给 T 的构造函数的构造函数实参
x - 要传递给 T1 的构造函数的构造函数实参
y - 要传递给 T2 的构造函数的构造函数实参
xy - 其两个成员是 T1T2 的构造函数实参的 pair
non_pair - 要转换为 pair 以进行进一步构造的非 pair 实参

[编辑] 返回值

(无)

[编辑] 注解

任何 allocator-aware 对象(例如 std::pmr::vector,或另一个给定了 std::pmr::polymorphic_allocator 作为要使用的分配器的 std::vector )都会调用此函数(通过 std::allocator_traits)。

[编辑] 缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布行为 正确行为
LWG 2969 C++17 uses-allocator 构造传递了 resource() 传递 *this
LWG 2975 C++17 在某些情况下,第一个重载被错误地用于 pair 构造 约束为不接受 pair
LWG 3525 C++17 没有重载可以处理可转换为 pair 的非 pair 类型 添加了重建重载

[编辑] 参见

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