命名空间
变体
操作

std::uses_allocator_construction_args

来自 cppreference.com
< cpp‎ | memory
 
 
实用程序库
语言支持
类型支持 (基本类型,RTTI)
库功能测试宏 (C++20)
动态内存管理
程序实用程序
协程支持 (C++20)
可变参数函数
调试支持
(C++26)
三方比较
(C++20)
(C++20)(C++20)(C++20)
(C++20)(C++20)(C++20)
通用实用程序
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中已弃用)
整数比较函数
(C++20)(C++20)(C++20)   
(C++20)
交换类型操作
(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 的特化时,此重载才会参与重载解析。对于 Tstd::pair<T1, T2>,等效于
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_; // exposition only
    NonPair&     u_;     // exposition only
 
    constexpr reconstruct(const std::remove_cv<T>& p) const // exposition only
    {
        return std::make_obj_using_allocator<std::remove_cv<T>>(alloc_, p);
    }
 
    constexpr reconstruct(std::remove_cv<T>&& p) const // exposition only
    {
        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_construction 为类型 pair-constructor 的值,其 alloc_u_ 成员分别为 allocnon_pair

内容

[edit] 参数

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

[edit] 返回值

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

[edit] 备注

重载 (2-9) 提供了对 std::pair 的分配器传播,std::pair 不支持前置分配器或后置分配器调用约定(与例如 std::tuple 不同,std::tuple 使用前置分配器约定)。

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

[edit] 示例

[edit] 缺陷报告

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

DR 应用于 发布的行为 正确的行为
LWG 3525 C++20 没有重载可以处理可转换为 pair 的非 pair 类型 添加了重建重载

[edit] 另请参阅

检查指定类型是否支持使用分配器构造
(类模板) [edit]
通过使用分配器构造创建指定类型的对象
(函数模板) [edit]
通过使用分配器构造在指定内存位置创建指定类型的对象
(函数模板) [edit]