Namespaces
Variants

std::experimental::ranges:: common_reference

From cppreference.net
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
  • 否则,不存在简单公共引用类型。

目录

成员类型

名称 定义
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 结果。主模板为空。

特化

程序可以在前两个参数 T U 上特化 basic_common_reference<T, U, TQual, UQual> ,前提是 std:: is_same < T, std:: decay_t < T >> std:: is_same < U, std:: decay_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 本身进行特化。违反这些规则添加特化的程序将导致未定义行为。

注释

示例

另请参阅

确定一组类型的公共类型
(类模板)
确定类型集合的公共类型
(类模板)
指定两种类型共享一个公共引用类型
(概念)