命名空间
变体
操作

std::experimental::ranges::common_type

来自 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_type
标记对和元组
                          
标签说明符
                                      
                          
 
template< class... T >
struct common_type;
(ranges TS)

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

  • 如果 sizeof...(T) 为零,则没有成员 type
  • 如果 sizeof...(T) 为一(即,T... 仅包含一个类型 T0),则成员 type 命名与 std::decay_t<T0> 相同的类型。
  • 如果 sizeof...(T) 为二(即,T... 恰好包含两个类型 T1T2),
  • 如果对 T1T2 中的至少一个应用 std::decay 产生不同的类型,则成员 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

内容

[编辑] 成员类型

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

[编辑] 辅助类型

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

[编辑] 特化

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

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

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

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

[编辑] 注解

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

[编辑] 示例

[编辑] 参见

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