std::experimental::ranges::common_type
来自 cppreference.cn
< cpp | experimental | ranges
template< class... T > struct common_type; |
(ranges TS) | |
确定所有类型 T...
之间的公共类型,即所有 T...
可以隐式转换为的类型。如果存在这样的类型(根据以下规则确定),则成员 type
命名该类型。否则,没有成员 type
。如果 T...
中的任何类型是不完整类型,但可能是(可能带有 cv 限定符的) void,则行为未定义。
- 如果 sizeof...(T) 为零,则没有成员
type
。 - 如果 sizeof...(T) 为一(即,
T...
仅包含一个类型T0
),则成员type
命名与 std::decay_t<T0> 相同的类型。 - 如果 sizeof...(T) 为二(即,
T...
恰好包含两个类型T1
和T2
),
- 如果对
T1
和T2
中的至少一个应用 std::decay 产生不同的类型,则成员type
命名与 ranges::common_type_t<std::decay_t<T1>, std::decay_t<T2>> 相同的类型(如果存在);如果不存在,则没有成员type
; - 否则(并且除非存在 ranges::common_type<T1, T2> 的用户特化),如果 std::common_type_t<T1, T2> 是良构的,则成员
type
表示该类型; - 否则,成员
type
表示类型 std::decay_t<decltype(false ? std::declval<const T1&>() : std::declval<const T2&>())>,如果该条件表达式是良构的;如果不是,则没有成员type
。
- 如果对
- 如果 sizeof...(T) 大于二(即,
T...
由类型T1, T2, R...
组成),则如果 ranges::common_type_t<T1, T2> 存在,则成员type
表示 ranges::common_type_t<ranges::common_type_t<T1, T2>, R...> (如果这样的类型存在)。在所有其他情况下,没有成员type
。
内容 |
[编辑] 成员类型
名称 | 定义 |
type
|
所有 T... 的公共类型 |
[编辑] 辅助类型
template< class... T > using common_type_t = typename common_type<T...>::type; |
||
[编辑] 特化
用户可以为类型 T1
和 T2
特化 common_type
,如果
T1
和T2
中至少有一个依赖于用户定义的类型,并且- std::decay 对于
T1
和T2
都是恒等变换。
如果这样的特化具有名为 type
的成员,则它必须是公共且明确的成员类型,该类型命名一个 cv 非限定的非引用类型,T1
和 T2
都可以显式转换为该类型。此外,ranges::common_type_t<T1, T2> 和 ranges::common_type_t<T2, T1> 必须表示相同的类型。
违反这些规则添加 common_type
特化的程序具有未定义的行为。
[编辑] 注解
对于不受提升影响的算术类型,公共类型可以被视为(可能混合模式的)算术表达式(例如 T0() + T1() + ... + Tn())的类型。
[编辑] 示例
本节尚不完整 原因:没有示例 |
[编辑] 参见
(C++11) |
确定一组类型的公共类型 (类模板) |
确定一组类型的公共引用类型 (类模板) |