命名空间
变体
操作

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

来自 cppreference.com
 
 
动态内存管理
未初始化内存算法
约束未初始化内存算法
分配器
垃圾回收支持
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)
(C++11)(直到 C++23)



 
 
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 指示的未初始化内存位置使用 *this 作为分配器执行 使用分配器构造,创建给定类型 U 的对象。 仅当 U 不是 std::pair 的特化时,此重载才参与重载解析。 (直到 C++20)
2) 首先,如果 T1T2 是分配器感知的,则根据以下三个规则修改元组 xy 以包含 this->resource(),从而产生两个新的元组 xprimeyprime
2a) 如果 T1 不是分配器感知的 (std::uses_allocator<T1, polymorphic_allocator>::value==false) 且 std::is_constructible<T1, Args1...>::value==true,则 xprimex,未修改。
2b) 如果 T1 是分配器感知的 (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 支持分配器感知 (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 被构造,就构造分配存储中的对 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<>()), 也就是说,如果这对的成员类型接受内存资源,则将内存资源传递给它们。
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 的构造函数参数的对
non_pair - pair 参数,转换为 pair 以进行进一步构造

[编辑] 返回值

(无)

[编辑] 备注

此函数由任何支持分配器感知的对象调用(通过 std::allocator_traits),例如 std::pmr::vector(或另一个 std::vector,它被赋予了 std::pmr::polymorphic_allocator 作为要使用的分配器)。

[编辑] 缺陷报告

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

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

[编辑] 参见

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