std::experimental::ranges::common_type
< cpp | experimental | ranges
template< class... T > struct common_type; |
(范围 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
),则
- 若应用 std::decay 到
T1
和T2
的至少一个产生不同类型,则成员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
。
- 若应用 std::decay 到
- 若 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) |
确定一组类型的公共类型 (类模板) |
确定类型集合的公共引用类型 (类模板) |