std::experimental::ranges::common_reference

来自cppreference.com
< cpp‎ | experimental‎ | ranges
 
 
技术规范
文件系统库 (文件系统 TS)
库基础 (库基础 TS)
库基础 2 (库基础 TS v2)
库基础 3 (库基础 TS v3)
并行扩展 (并行 TS)
并行扩展 2 (并行 TS v2)
并发扩展 (并发 TS)
并发扩展 2 (并发 TS v2)
概念 (概念 TS)
范围 (范围 TS)
反射 (反射 TS)
数学特殊函数 (特殊函数 TR)
 
 
通用工具库
工具组件
函数对象
元编程与类型特性
common_reference
有标签的 pair 与 tuple
                          
标签说明符
                                      
                          
 
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 为该类型;
    • 否则,无成员 type
  • sizeof...(T) 大于二(即 T...T1, T2, R... 组成),则若 ranges::common_reference_t<T1, T2> 存在,且 ranges::common_reference_t<ranges::common_reference_t<T1, T2>, R...> 存在,则成员类型 type 指代它。所有其他情况下,无成员类型 type

二个引用类型 T1T2简单共用引用类型定义如下:

  • T1cv1 X &T2cv2 Y & (即都是左值引用):则其简单共用引用类型为 decltype(false? std::declval<cv12 X &>() : std::declval<cv12 Y &>()) ,其中 cv12cv1cv2 的联合,若该类型存在且为引用类型;
  • T1 a与 T2 均为右值引用类型:若 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
  • 否则,无简单共用引用类型。

成员类型

名称 定义
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 ,且它们至少有一个依赖于用户定义类型,则程序可以在前二个形参 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 自身。以违背这些规则的方式添加特化的程序拥有未定义行为。

注意

示例

参阅

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