std::scoped_allocator_adaptor<OuterAlloc,InnerAlloc...>::construct
在标头 <scoped_allocator> 定义
|
||
template< class T, class... Args > void construct( T* p, Args&&... args ); |
(1) | |
template< class T1, class T2, class... Args1, class... Args2 > void construct( std::pair<T1, T2>* p, |
(2) | (C++20 前) |
template< class T1, class T2 > void construct( std::pair<T1, T2>* p ); |
(3) | (C++20 前) |
template< class T1, class T2, class U, class V > void construct( std::pair<T1, T2>* p, U&& x, V&& y ); |
(4) | (C++20 前) |
(5) | (C++20 前) | |
(6) | (C++20 前) | |
template< class T1, class T2, class NonPair > void construct( std::pair<T1, T2>* p, NonPair&& non_pair ); |
(7) | (C++20 前) |
在 p 所指向的分配但未初始化的存储中,用 OuterAllocator
与提供的构造函数实参构造对象。若对象是自身使用分配器的类型,或若它是 std::pair
,则下传 InnerAllocator
给构造的对象。
首先,获得最外层分配器 OUTERMOST
:调用 this->outer_allocator(),然后在此调用的结果上递归调用 outer_allocator()
成员函数,直至抵达无这种成员函数的分配器。
定义 OUTERMOST_ALLOC_TRAITS
(x) 为 std::allocator_traits<std::remove_reference_t<decltype(OUTERMOST(x))>>
T
的对象。在为 T
的构造函数所期待的使用分配器约定调整后,调用 OUTERMOST_ALLOC_TRAITS(*this)::construct。
此重载只有在 U 不是 std::pair 的特化时才会参与重载决议。
|
|
等价于 std::apply( [p, this](auto&&... newargs) |
2) 首先,若
T1 或 T2 具分配器,则按照下列三条规则修改元组 x 与 y 以包含适合的内层分配器,产生两个新的元组 xprime 与 yprime :2a) 若
T1 不具分配器(std::uses_allocator<T1, inner_allocator_type>::value == false),则 xprime 是 std::tuple<Args1&&...>(std::move(x))。(亦要求 std::is_constructible<T1, Args1...>::value == true)。2b) 若
T1 具分配器 (std::uses_allocator<T1, inner_allocator_type>::value == true),而其构造函数接受分配器标签std::is_constructible<T1, std::allocator_arg_t, std::allocator_arg, inner_allocator() ), std::tuple<Args1&&...>(std::move(x))) 2c) 若
T1 具分配器 (std::uses_allocator<T1, inner_allocator_type>::value == true),且其构造函数接收分配器为末尾实参std::is_constructible<T1, Args1..., inner_allocator_type&>::value == true, std::tuple<inner_allocator_type&>(inner_allocator()))。 应用相同规则到
T2 并以 yprime 替换 y 。 一旦构造了
xprime 与 yprime ,则在所分配的存储中构造对偶 p,通过调用std::allocator_traits<O>::construct(OUTERMOST, p, std::piecewise_construct, std::move(xprime), std::move(yprime)); 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))) 7) 此重载只有在给定仅用于阐释的函数模板
template<class A, class B> |
(C++20 前) |
参数
p | - | 指向被分配但未初始化的存储的指针 |
args... | - | 传递给 T 的构造函数的构造函数实参
|
x | - | 传递给 T1 的构造函数的构造函数实参
|
y | - | 传递给 T2 的构造函数的构造函数实参
|
xy | - | 两个成员分别为 T1 与 T2 构造函数实参的 pair
|
non_pair | - | 转换成 pair 以进行进一步构造的非 pair 实参
|
返回值
(无)
注解
此函数由任何具分配器对象,例如 std::vector,在给予了 std::scoped_allocator_adaptor 作为所用分配器时(通过 std::allocator_traits)调用。因为 inner_allocator
自身是 std::scoped_allocator_adaptor 的实例,此函数亦在具分配器对象通过此函数开始构造其自身成员时得到调用。
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 2975 | C++11 | 某些情况下 pair 构造错误地使用第一重载 | 制约为不接受 pair |
P0475R1 | C++11 | pair 逐片构造可能复制参数 | 变换到引用的 tuple 以避免复制 |
LWG 3525 | C++11 | 没有能处理可转换到 pair 的非 pair 类型
|
添加了重构的重载 |
参阅
[静态] |
在已分配存储中构造对象 (函数模板) |
(C++20 前) |
在分配的存储中构造对象 ( std::allocator<T> 的公开成员函数) |