std::experimental::ranges::common_reference
|   template< class... T > struct common_reference;  | 
(范围 TS) | |
确定类型 T... 的公共引用类型,即 T... 中所有类型能转换或绑定到的类型。若这种类型存在(如按照后述规则所确定),则成员 type 指名该类型。否则,无成员 type 。若 T... 中的任何类型为(可有 cv 限定的) void 以外的不完整类型,则行为未定义。
给定引用类型是, common_reference 试图寻找所有提供的引用类型都能绑定到的引用类型,但若找不到这种引用类型,则可能返回非引用类型。
-  若 sizeof...(T) 为零,则无成员 
type。 -  若 sizeof...(T) 为一(即 
T...仅含一个类型T0),则成员type指名与 T0 相同的类型。 -  若 sizeof...(T) 为二(即 
T...含二个类型T1和T2),则:-  若 
T1和T2都是引用类型,而T1和T2的简单共用引用类型S存在,则成员类型type指名S; -  否则,若 basic_common_reference<T1R, T2R, T1Q, T2Q>::type 存在,其中 
TiR为 std::remove_cv_t<std::remove_reference_t<Ti>> ,而TiQ为使得 TiQ<TiR> 为 Ti 的别名模版,则成员类型type指名该类型; -  否则,若 decltype(false? val<T1>() : val<T2>()) 是合法类型,其中 
val为函数模板 template<class T> T val(); ,则成员类型type指名该类型; -  否则,若 ranges::common_type_t<T1, T2> 为合法类型,则成员类型 
type为该类型; -  否则,无成员 
type。 
 -  若 
 -  若 sizeof...(T) 大于二(即 
T...由T1, T2, R...组成),则若 ranges::common_reference_t<T1, T2> 存在,且 ranges::common_reference_t<ranges::common_reference_t<T1, T2>, R...> 存在,则成员类型type指代它。所有其他情况下,无成员类型type。 
二个引用类型 T1 和 T2 的简单共用引用类型定义如下:
-  若 
T1为cv1 X &而T2为cv2 Y &(即都是左值引用):则其简单共用引用类型为 decltype(false? std::declval<cv12 X &>() : std::declval<cv12 Y &>()) ,其中 cv12 为 cv1 与 cv2 的联合,若该类型存在且为引用类型; -  若 
T1a与T2均为右值引用类型:若T1 &和T2 &的简单共用引用类型(按照前一条确定)存在,则令C代表该类型的对应右值引用类型。若 std::is_convertible<T1, C>::value 与 std::is_convertible<T2, C>::value 均为true,则T1与T2的简单共用引用类型为C。 -  否则,二个类型之一必须为左值引用类型 
A &而另一个必须为右值引用类型B &&(A与B可为 cv 限定)。令D代表 A & 与 B const & 的简单共用引用类型,若它存在。若 D 存在且 std::is_convertible<B &&, D>::value 为true,则简单共用引用类型为D。 - 否则,无简单共用引用类型。
 
成员类型
| 名称 | 定义 | 
  type
 | 
 所有 T... 的共用引用类型
 | 
辅助类型
|   template< class... T > using common_reference_t = typename common_reference<T...>::type;  | 
||
|   template< class T, class U, template<class> class TQual, template<class> class UQual > struct basic_common_reference { };  | 
||
类模板 basic_common_reference 是定制点,允许用户影响 common_reference 对用户定义类型(常为代理引用)的结果。初等模板为空。
特化
若 std::is_same<T, std::decay_t<T>> 与 std::is_same<U, std::decay_t<U>> 皆为 true ,且它们至少有一个依赖于用户定义类型,则程序可以在前二个形参 T 和 U 上特化 basic_common_reference<T, U, TQual, UQual> 。
若这种特化拥有名为 type 的成员,则它必须是指名 TQual<T> 和 UQual<U> 都能转换到的类型的公开且无歧义的成员类型。另外, ranges::basic_common_reference<T, U, TQual, UQual>::type 和 ranges::basic_common_reference<U, T, UQual, TQual>::type 必须指代同一类型。
程序不可以在第三或第四形参上特化 basic_common_reference ,亦不可特化 common_reference 自身。以违背这些规则的方式添加特化的程序拥有未定义行为。
注意
| 本节未完成 | 
示例
| 本节未完成 原因:暂无示例  | 
参阅
|    (C++11)  | 
   确定一组类型的公共类型   (类模板)  | 
|   确定类型集合的公共类型  (类模板)  | |
|   指定两个类型共有一个公共引用类型   (概念)  |