std::uses_allocator_construction_args

来自cppreference.com
< cpp‎ | memory
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
初等字符串转换
(C++17)
(C++17)
 
动态内存管理
未初始化内存算法
受约束的未初始化内存算法
分配器
垃圾收集支持
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)
(C++11)(C++23 前)



 
在标头 <memory> 定义
T 不是 std::pair 的特化
template< class T, class Alloc, class... Args >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    Args&&... args) noexcept;
(1) (C++20 起)
Tstd::pair 的特化
template< class T, class Alloc, class Tuple1, class Tuple2 >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    std::piecewise_construct_t, Tuple1&& x, Tuple2&& y) noexcept;
(2) (C++20 起)
template< class T, class Alloc >
constexpr auto uses_allocator_construction_args( const Alloc& alloc ) noexcept;
(3) (C++20 起)
template< class T, class Alloc, class U, class V >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    U&& u, V&& v) noexcept;
(4) (C++20 起)
template< class T, class Alloc, class U, class V >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    std::pair<U, V>& pr ) noexcept;
(5) (C++23 起)
template< class T, class Alloc, class U, class V >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    const std::pair<U, V>& pr ) noexcept;
(6) (C++20 起)
template< class T, class Alloc, class U, class V >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    std::pair<U, V>&& pr ) noexcept;
(7) (C++20 起)
template< class T, class Alloc, class U, class V >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    const std::pair<U, V>&& pr ) noexcept;
(8) (C++23 起)
template< class T, class Alloc, class NonPair >

constexpr auto uses_allocator_construction_args( const Alloc& alloc,

    NonPair&& non_pair ) noexcept;
(9) (C++20 起)

准备以使用分配器构造的手段创建给定类型 T 对象所需的参数列表。

1) 此重载只有在 T 不是 std::pair 的特化时才会参与重载决议。返回按下列方式确定的 std::tuple
2) 此重载只有在 Tstd::pair 的特化时才会参与重载决议。对作为 std::pair<T1, T2>T 等价于
return std::make_tuple( std::piecewise_construct,
    std::apply( [&alloc](auto&&... args1) {
            return std::uses_allocator_construction_args<T1>( alloc,
                       std::forward<decltype(args1)>(args1)...);
        }, std::forward<Tuple1>(x)),
    std::apply( [&alloc](auto&&... args2) {
            return std::uses_allocator_construction_args<T2>( alloc,
                    std::forward<decltype(args2)>(args2)...);
        }, std::forward<Tuple2>(y))
    );
3) 此重载只有在 Tstd::pair 的特化时才会参与重载决议。等价于
return std::uses_allocator_construction_args<T>(alloc,
    std::piecewise_construct, std::tuple<>{}, std::tuple<>{}
);
4) 此重载只有在 Tstd::pair 的特化时才会参与重载决议。等价于
return std::uses_allocator_construction_args<T>( alloc,
    std::piecewise_construct,
    std::forward_as_tuple(std::forward<U>(u)),
    std::forward_as_tuple(std::forward<V>(v))
);
5-6) 此重载只有在 Tstd::pair 的特化时才会参与重载决议。等价于
return std::uses_allocator_construction_args<T>( alloc,
    std::piecewise_construct,
    std::forward_as_tuple(pr.first),
    std::forward_as_tuple(pr.second)
);
7-8) 此重载只有在 Tstd::pair 的特化时才会参与重载决议。等价于
return std::uses_allocator_construction_args<T>( alloc,
    std::piecewise_construct,
    std::forward_as_tuple(std::get<0>(std::move(pr))),
    std::forward_as_tuple(std::get<1>(std::move(pr)));
9) 此重载只有在 Tstd::pair 的特化,并且给定仅用于阐释的函数模板
template< class A, class B >
void /*deduce-as-pair*/( const std::pair<A, B>& );

/*deduce-as-pair*/(non_pair) 在当作不求值操作数时非良构时才会参与重载决议。
令仅用于阐释的类 pair-constructor 定义为

class /*pair-constructor*/ {
    const Alloc& alloc_; // 仅用于阐释
    NonPair&     u_;     // 仅用于阐释
 
    constexpr reconstruct(const std::remove_cv<T>& p) const // 仅用于阐释
    {
        return std::make_obj_using_allocator<std::remove_cv<T>>(alloc_, p);
    }
 
    constexpr reconstruct(std::remove_cv<T>&& p) const // 仅用于阐释
    {
        return std::make_obj_using_allocator<std::remove_cv<T>>(alloc_, std::move(p));
    }
 
public:
    constexpr operator std::remove_cv<T>() const
    {
        return reconstruct(std::forward<NonPair>(u_));
    }
};
此重载等价于 return std::make_tuple(pair_construction); ,其中 pair_constructionpair-constructor 类型的值,其 alloc_u_ 成员分别为 allocnon_pair

参数

alloc - 使用的分配器
args - 传递给 T 构造函数的参数
x - 传递给 Tfirst 数据成员的构造函数的参数 tuple
y - 传递给 Tsecond 数据成员的构造函数的参数 tuple
u - 传递给 Tfirst 数据成员的构造函数的单个参数
v - 传递给 Tsecond 数据成员的构造函数的单个参数
pr - 将其 first 数据成员传递给 Tfirst 数据成员的构造函数,并将其 second 数据成员传递给 Tsecond 数据成员的构造函数的 pair
non_pair - 转换成 std::pair 以供进一步构造的单个参数

返回值

适合于传递给 T 构造函数的参数的 std::tuple

示例

注解

重载 (2-9) 提供传入 std::pair 的分配器传播,它们不支持前导分配器或尾随分配器约定(不同于如使用前导分配器约定的 std::tuple )。

在用于使用分配器构造时, pair-constructor 的转换函数首先将提供的参数转换成 std::pair ,然后再以使用分配器构造从该 std::pair 构造结果。

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3525 C++20 没有重载能处理可转换成 pair 的非 pair 类型 添加了重构的重载

参阅

检查指定的类型是否支持使用分配器的构造
(类模板)
以使用分配器构造的手段创建给类型的对象
(函数模板)
以使用分配器构造的手段在指定的内存位置创建给定类型的对象
(函数模板)