Namespaces
Variants

std::experimental::ranges:: common_type

From cppreference.net
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... 恰好包含两个类型 T1 T2 ),
  • 若对 T1 T2 中至少一个类型应用 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 ;

特化

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

  • 至少有一个 T1 T2 依赖于用户定义类型,且
  • 对于 T1 T2 两者, std::decay 均为恒等变换。

若此类特化具有名为 type 的成员,则其必须是公开且无歧义的成员类型,该类型需命名一个cv非限定的非引用类型,且 T1 T2 均可显式转换至该类型。此外, ranges :: common_type_t < T1, T2 > ranges :: common_type_t < T2, T1 > 必须表示同一类型。

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

注释

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

示例

参见

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