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)
 
 
通用工具库
工具组件
函数对象
元编程与类型特性
common_type
有标签的 pair 与 tuple
                          
标签说明符
                                      
                          
 
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::decayT1T2 的至少一个产生不同类型,则成员 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() 的类型。

示例

参阅

确定一组类型的公共类型
(类模板)
确定类型集合的公共引用类型
(类模板)