位置:首页 > > std::experimental::ranges::common_type
std::experimental::ranges::common_type
| 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) |
确定一组类型的公共类型 (类模板) |
| 确定类型集合的公共引用类型 (类模板) |