命名空间
变体
操作

std::experimental::ranges::common_reference

来自 cppreference.cn
< cpp‎ | experimental‎ | ranges
 
 
实验性
技术规范
文件系统库 (文件系统 TS)
库基础 (库基础 TS)
库基础 2 (库基础 TS v2)
库基础 3 (库基础 TS v3)
并行性扩展 (并行性 TS)
并行性扩展 2 (并行性 TS v2)
并发扩展 (并发 TS)
并发扩展 2 (并发 TS v2)
概念 (概念 TS)
范围 (范围 TS)
反射 (反射 TS)
数学特殊函数 (特殊函数 TR)
实验性非 TS
模式匹配
线性代数
std::execution
契约
2D 图形
 
 
通用工具库
实用组件
函数对象
元编程和类型特征
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... 包含两个类型 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
  • 否则,没有简单公共引用类型。

目录

[编辑] 成员类型

名称 定义
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 本身。违反这些规则添加特化的程序具有未定义的行为。

[编辑] 注释

[编辑] 示例

[编辑] 参见

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