命名空间
变体
操作

std::experimental::ranges::common_reference

来自 cppreference.com
< cpp‎ | experimental‎ | ranges
在头文件 <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... 包含两个类型 T1T2
    • 如果 T1T2 都是引用类型,并且 T1T2简单公共引用类型 S(如下定义)存在,则成员类型 type 将命名 S
    • 否则,如果 basic_common_reference<T1R, T2R, T1Q, T2Q>::type 存在,其中 TiRstd::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

两个引用类型 T1T2简单公共引用类型 定义如下

  • 如果 T1cv1 X &T2cv2 Y &(即,两者都是左值引用类型):它们的简单公共引用类型是 decltype(false? std::declval<cv12 X &>() : std::declval<cv12 Y &>()),其中 cv12cv1cv2 的并集,如果该类型存在且是引用类型。
  • 如果 T1T2 都是右值引用类型:如果 T1 &T2 & 的简单公共引用类型(根据前面的项目确定)存在,则令 C 表示该类型的相应右值引用类型。如果 std::is_convertible<T1, C>::valuestd::is_convertible<T2, C>::value 都为 true,则 T1T2 的简单公共引用类型为 C
  • 否则,两个类型之一必须是左值引用类型 A &,另一个必须是右值引用类型 B &&AB 可能限定为 cv)。令 D 表示 A &B const & 的简单公共引用类型(如果有)。如果 D 存在且 std::is_convertible<B &&, D>::valuetrue,则简单公共引用类型为 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>>都是真,并且其中至少一个依赖于程序定义的类型,程序可以对前两个参数TU进行basic_common_reference<T, U, TQual, UQual>特化。

如果这样的特化具有名为type的成员,它必须是一个公共且明确的成员类型,它命名一个类型,其中TQual<T>UQual<U>都是可转换的。此外,ranges::basic_common_reference<T, U, TQual, UQual>::typeranges::basic_common_reference<U, T, UQual, TQual>::type必须表示相同的类型。

程序不能对第三个或第四个参数进行basic_common_reference特化,也不能对common_reference本身进行特化。违反这些规则添加特化的程序具有未定义的行为。

[编辑] 注释

[编辑] 示例

[编辑] 另请参阅

确定一组类型的公共类型
(类模板) [编辑]
确定一组类型的公共类型
(类模板) [编辑]
指定两个类型共享一个公共引用类型
(概念) [编辑]