std::experimental::ranges::common_reference
| template< class... T > struct common_reference; |
(ranges 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命名该类型; - 否则,没有成员类型。
- 如果
- 如果 sizeof...(T) 大于二(即,
T...由类型T1, T2, R...组成),那么如果 ranges::common_reference_t<T1, T2> 存在,则成员type表示 ranges::common_reference_t<ranges::common_reference_t<T1, T2>, R...>(如果存在这样的类型)。在所有其他情况下,没有成员type。
两个引用类型 T1 和 T2 的简单公共引用类型定义如下:
- 如果
T1是cv1 X &且T2是cv2 Y &(即,两者都是左值引用类型):它们的简单公共引用类型是 decltype(false? std::declval<cv12 X &>() : std::declval<cv12 Y &>()),其中 cv12 是 cv1 和 cv2 的并集,如果该类型存在且是引用类型。 - 如果
T1和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。 - 否则,没有简单公共引用类型。
目录 |
[编辑] 成员类型
| 名称 | 定义 |
类型
|
所有 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 并且其中至少一个依赖于程序定义类型,则程序可以对 basic_common_reference<T, U, TQual, UQual> 的前两个参数 T 和 U 进行特化。
如果这样的特化有一个名为 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) |
确定一组类型的公共类型 (类模板) |
| 确定一组类型的公共类型 (类模板) | |
| 指定两种类型共享一个共同的引用类型 (概念) |