std::experimental::ranges::common_type
来自cppreference.com
                    
                                        
                    < 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)  | 
   确定一组类型的公共类型   (类模板)  | 
|   确定类型集合的公共引用类型  (类模板)  |