命名空间
变体
操作

std::experimental::ranges::common_type

来自 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)
实验性非 TS
模式匹配
线性代数
std::execution
契约
2D 图形
 
 
通用实用程序库
实用程序组件
函数对象
元编程和类型特征
common_type
标记对和元组
                          
标签说明符
                                      
                          
 
定义在头文件 <experimental/ranges/type_traits>
template< class... T >
struct common_type;
(范围 TS)

确定所有类型 T... 的公共类型,即所有 T... 可以隐式转换为的类型。如果存在这样的类型(根据以下规则确定),则成员 type 将命名该类型。否则,没有成员 type。如果 T... 中的任何类型是不完整的类型,除了(可能是 cv 限定的)void,则行为未定义。

  • 如果 sizeof...(T) 为零,则没有成员 type
  • 如果 sizeof...(T) 为一(即,T... 只包含一个类型 T0),则成员 type 将命名与 std::decay_t<T0> 相同的类型。
  • 如果 sizeof...(T) 为二(即,T... 恰好包含两个类型 T1T2),
  • 如果将 std::decay 应用于 T1T2 中至少一个类型会产生不同的类型,则成员 type 将命名与 ranges::common_type_t<std::decay_t<T1>, std::decay_t<T2>> 相同的类型,如果存在;如果不存在,则没有成员 type
  • 否则(并且除非 ranges::common_type<T1, T2> 存在用户特化),如果 std::common_type_t<T1, T2> 形成良好,则成员 type 表示该类型;
  • 否则,成员 type 将表示类型 std::decay_t<decltype(false ? std::declval<const T1&>() : std::declval<const T2&>())>,如果该条件表达式形成良好;如果不存在,则没有成员 type
  • 如果 sizeof...(T) 大于二(即,T... 由类型 T1, T2, R... 组成),那么如果 ranges::common_type_t<T1, T2> 存在,则成员 type 表示 ranges::common_type_t<ranges::common_type_t<T1, T2>, R...>,如果存在这样的类型。在所有其他情况下,没有成员 type

内容

[编辑] 成员类型

名称 定义
类型 所有 T... 的公共类型

[编辑] 辅助类型

template< class... T >
using common_type_t = typename common_type<T...>::type;

[编辑] 特化

用户可以为类型 T1T2 特化 common_type,如果

  • T1T2 中至少一个依赖于用户定义的类型,并且
  • std::decayT1T2 的恒等变换。

如果这样的特化具有名为 type 的成员,则它必须是公用且明确的成员类型,该类型命名一个 cv 非限定非引用类型,T1T2 都可以显式转换为该类型。此外,ranges::common_type_t<T1, T2>ranges::common_type_t<T2, T1> 必须表示相同类型。

违反这些规则添加 common_type 特化的程序具有未定义的行为。

[编辑] 注释

对于不受提升影响的算术类型,公共类型可以被视为(可能是混合模式)算术表达式(如 T0() + T1() + ... + Tn())的类型。

[编辑] 示例

[编辑] 另请参阅

确定一组类型的公共类型
(类模板) [编辑]
确定一组类型的公共引用类型
(类模板) [编辑]