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
命名该类型; - 否则,没有成员类型。
- 如果
- 如果 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
。 - 否则,没有简单公共引用类型。
目录 |
[编辑] 成员类型
名称 | 定义 |
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) |
确定一组类型的公共类型 (类模板) |
确定一组类型的公共类型 (类模板) | |
指定两种类型共享一个公共引用类型 (概念) |