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, std::piecewise_construct_t, |
(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 T, class... Args > std::tuple</* 见下方 */> /*concat-args*/( std::tuple<Args...>&& tup ); |
(7) | (仅为说明目的*) (直到 C++20) |
在 p 指向的已分配但未初始化的存储中,使用外部分配器和提供的构造函数实参构造对象。如果对象类型本身使用分配器,或者如果是 std::pair(直到 C++20),则将内部分配器向下传递给构造的对象。
T
的对象。
给定 std::uses_allocator<T, inner_allocator_type>::value 为 uses_inner
此重载仅在 |
(直到 C++20) |
等效于 std::apply |
(自 C++20 起) |
concat-args
<T1>(std::move(x)),yprime 为 concat-args
<T2>(std::move(y)),调用 outermost-construct
(p, std::piecewise_construct, std::move(xprime), std::move(yprime))。std::forward_as_tuple(xarg), std::forward_as_tuple(yarg));,其中 xarg 和 yarg 定义如下
重载 | xarg | yarg |
---|---|---|
(4) | std::forward<U>(x) | std::forward<V>(y) |
(5) | xy.first | xy.second |
(6) | std::forward<U>(xy.first) | std::forward<V>(xy.second) |
- 如果 uses_inner 为 false 且 std::is_constructible<T, Args...>::value 为 true,则返回 std::tuple<Args&&...>(std::move(tup))。
- 否则,如果 uses_inner 和 std::is_constructible<T, std::allocator_arg_t,
inner_allocator_type&,
Args...>::value 都为 true,则返回 std::tuple_cat(std::tuple<std::allocator_arg_t, inner_allocator_type&>
(std::allocator_arg, inner_allocator()),
std::tuple<Args&&...>(std::move(tup)))。 - 否则,如果 uses_inner 和 std::is_constructible<T, Args..., inner_allocator_type&>::value 都为 true,则返回 std::tuple_cat(std::tuple<Args&&...>(std::move(tup)),
std::tuple<inner_allocator_type&>(inner_allocator())。 - 否则,程序是非良构的。
目录 |
[编辑] 参数
p | - | 指向已分配但未初始化的存储的指针 |
args | - | 传递给 T 的构造函数的构造函数实参 |
x | - | 传递给 T1 的构造函数的构造函数实参 |
y | - | 传递给 T2 的构造函数的构造函数实参 |
xy | - | 其两个成员是 T1 和 T2 的构造函数实参的 pair |
tup | - | 要合并的实参 |
[编辑] 注解
此函数由任何分配器感知对象(例如 std::vector)调用(通过 std::allocator_traits),这些对象被赋予了 std::scoped_allocator_adaptor 作为要使用的分配器。由于 inner_allocator_type
本身是 std::scoped_allocator_adaptor 的特化,因此当通过此函数构造的分配器感知对象开始构造其自身成员时,也会调用此函数。
[编辑] 缺陷报告
以下行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
DR | 应用于 | 已发布时的行为 | 正确的行为 |
---|---|---|---|
LWG 2203 | C++11 | 内部分配器通过值初始化获得inner_allocator_type 对象 |
通过调用 inner_allocator() 获得 |
LWG 2511 (P0475R1) |
C++11 | concat-args 可能复制 std::tuple 的元素 |
消除了所有元素复制操作 |
LWG 2586 | C++11 | 仅检查来自inner_allocator_type 右值的构造 |
检查来自非 constinner_allocator_type 左值的构造,改为 |
LWG 2975 | C++11 | 重载 (1) 未受约束 | 约束为拒绝 std::pair |
[编辑] 参见
[静态] |
在已分配的存储中构造对象 (函数模板) |
(直到 C++20) |
在已分配的存储中构造对象 ( std::allocator<T> 的公共成员函数) |