【问题标题】:Does enumerator used in expression have the same type as underlying type of its enum?表达式中使用的枚举数是否与其枚举的基础类型具有相同的类型?
【发布时间】:2017-07-13 21:31:17
【问题描述】:

枚举常量的类型是什么,当它在非作用域枚举定义之外使用时?

考虑以下代码:

#include <iostream>

enum modes
{
    begin = 0,
    end = 1
};

int main()
{
    std::cout << std::boolalpha
        << std::is_same<unsigned int, typename std::underlying_type<modes>::type>::value
        << std::endl;
    std::cout << sizeof(modes) << std::endl;
    std::cout << (-100 + end) << std::endl;
}

这会在我的机器上产生:

true
4
-99

现在,如果我只将其他一些枚举器的值 begin 更改为 2147483648,那么我的输出将变为:

true
4
4294967197

显然,这意味着end的类型已经从int变为unsigned int,即使modes的底层类型仍然相同(即unsigned int)。

关于枚举的积分提升是否有一些特殊规则?

【问题讨论】:

    标签: c++ enums enumeration enumerator integer-promotion


    【解决方案1】:

    来自 C++ 标准(7.2 枚举声明)

    1. ...在枚举说明符的右大括号之后,每个枚举数都有其枚举的类型。...

    和(4.5 积分促销)

    3 无作用域枚举类型的纯右值,其基础类型为 not fixed (7.2) 可以转换为第一个的prvalue 以下类型可以表示枚举的所有值 (即 7.2 中描述的 bmin 到 bmax 范围内的值):int, unsigned int、long int、unsigned long int、long long int 或 unsigned 长长整数。如果该列表中没有一个类型可以代表所有 枚举的值,无作用域枚举类型的纯右值 可以转换为扩展整数类型的右值,最低 整数转换秩(4.13)大于long long in的秩 可以表示枚举的所有值。如果有 是两种这样的扩展类型,选择有符号的。

    【讨论】:

    • "可以转换为以下第一种类型的纯右值,可以表示枚举的所有值"。这正是我所寻找的。谢谢。
    【解决方案2】:

    枚举常量的类型是什么,当它在非作用域枚举定义之外使用时?

    当然是枚举类型。 begin 的类型是 modes。如果它有一个整数类型,那么你关于枚举的整数提升的问题就没有意义了。

    对于使用枚举的积分促销有一些特殊规则吗?

    不是真的。您正在考虑枚举的基础类型的整体提升,但这是不同的。对于 enum 类型本身,需要考虑 enum 类型的有效值范围,它可以小于 enum 底层类型的有效值范围。 int 可以代表所有有效值吗?如果是这样,你会得到一个int

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-30
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 2012-09-16
      • 1970-01-01
      • 2010-10-25
      • 1970-01-01
      相关资源
      最近更新 更多