std::uses_allocator
来自 cppreference.cn
定义于头文件 <memory> |
||
template< class T, class Alloc > struct uses_allocator; |
(自 C++11 起) | |
如果 T
拥有一个嵌套类型 allocator_type
,且该类型可从 Alloc
转换而来,则成员常量 value 为 true。否则 value 为 false。
内容 |
[编辑] 辅助变量模板
template< class T, class Alloc > constexpr bool uses_allocator_v = uses_allocator<T, Alloc>::value; |
(自 C++17 起) | |
继承自 std::integral_constant
成员常量
value [静态] |
true 如果 T 使用分配器 Alloc ,否则为 false(public static member constant) |
成员函数
operator bool |
将对象转换为 bool,返回 value (public member function) |
operator() (C++14) |
返回 value (public member function) |
成员类型
类型 | 定义 |
value_type
|
bool |
type
|
std::integral_constant<bool, value> |
[编辑] Uses-allocator 构造
将分配器 alloc 传递给类型 T
的构造函数有三种约定
- 如果
T
不使用兼容的分配器(std::uses_allocator_v<T, Alloc> 为 false),则alloc
会被忽略。 - 否则,std::uses_allocator_v<T, Alloc> 为 true,并且
- 如果
T
使用前导分配器约定(可调用为 T(std::allocator_arg, alloc, args...)),则 uses-allocator 构造使用此形式。 - 如果
T
使用尾随分配器约定(可调用为 T(args..., alloc)),则 uses-allocator 构造使用此形式。 - 否则,程序是非良构的(这意味着 std::uses_allocator_v<T, Alloc> 为 true,但该类型不遵循两种允许的约定中的任何一种)。
- 如果
- 作为特殊情况,即使
std::uses_allocator
对于 pair 为 false(与 std::tuple 等不同),std::pair 也被视为 uses-allocator 类型:参见 std::pmr::polymorphic_allocator::construct 和 std::scoped_allocator_adaptor::construct(直到 C++20)std::uses_allocator_construction_args(自 C++20 起) 的 pair 特有重载。
实用工具函数 std::make_obj_using_allocator 和 std::uninitialized_construct_using_allocator 可用于显式地按照上述协议创建对象,而 std::uses_allocator_construction_args 可用于准备与类型期望的 uses-allocator 构造风格相匹配的参数列表。 |
(自 C++20 起) |
[编辑] 特化
给定一个程序定义的类型 T
,它没有嵌套的 allocator_type
,如果满足以下任何要求,程序可以特化 std::uses_allocator
以从 T
的 std::true_type 派生
-
T
有一个构造函数,它接受 std::allocator_arg_t 作为第一个参数,以及Alloc
作为第二个参数。 -
T
有一个构造函数,它接受Alloc
作为最后一个参数。
在上面,Alloc
是一种满足 Allocator 或可转换为 std::experimental::pmr::memory_resource* 的指针类型的类型(库基础 TS)。
标准库已经提供了以下特化
特化 std::uses_allocator 类型特征 (类模板特化) | |
特化 std::uses_allocator 类型特征 (类模板特化) | |
特化 std::uses_allocator 类型特征 (类模板特化) | |
特化 std::uses_allocator 类型特征 (类模板特化) | |
特化 std::uses_allocator 类型特征 (类模板特化) | |
特化 std::uses_allocator 类型特征 (类模板特化) | |
特化 std::uses_allocator 类型特征 (类模板特化) | |
特化 std::uses_allocator 类型特征 (类模板特化) | |
(C++11) (直到 C++17) |
特化 std::uses_allocator 类型特征 (类模板特化) |
特化 std::uses_allocator 类型特征 (类模板特化) | |
(C++11) (直到 C++17) |
特化 std::uses_allocator 类型特征 (类模板特化) |
[编辑] 注解
此类型特征被 std::tuple、std::scoped_allocator_adaptor 和 std::pmr::polymorphic_allocator 使用。自定义分配器或包装器类型也可以使用它来确定正在构造的对象或成员本身是否能够使用分配器(例如,是否为容器),在这种情况下,应将分配器传递给其构造函数。
[编辑] 参见
(C++11) |
用于选择分配器感知构造函数的标签 (标签) |
准备给定类型所需的 uses-allocator 构造风格的参数列表 (函数模板) | |
(C++20) |
通过 uses-allocator 构造创建给定类型的对象 (函数模板) |
通过 uses-allocator 构造在指定的内存位置创建给定类型的对象 (函数模板) | |
(C++11) |
为多层容器实现多层分配器 (类模板) |