std::experimental::ranges::common_reference
在头文件 <experimental/ranges/type_traits> 中定义 |
||
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
。 - 否则,没有简单公共引用类型。
内容 |
[编辑] 成员类型
名称 | 定义 |
类型
|
所有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>>都是真,并且其中至少一个依赖于程序定义的类型,程序可以对前两个参数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) |
确定一组类型的公共类型 (类模板) |
确定一组类型的公共类型 (类模板) | |
指定两个类型共享一个公共引用类型 (概念) |