表达式中使用的枚举数是否与其枚举的基础类型具有相同的类型?

时间:2017-07-13 21:31:18

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

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

请考虑以下代码:

#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 })。

关于枚举的整体促销是否有一些特殊规则?

2 个答案:

答案 0 :(得分:7)

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

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

和(4.5整体促销)

  

3未编码枚举类型的prvalue,其基础类型为   不固定(7.2)可以转换为第一个的prvalue   以下类型可以表示枚举的所有值   (即7.2中描述的bmin到bmax范围内的值):int,   unsigned int,long int,unsigned long int,long long int或unsigned   长期的。如果该列表中的任何类型都不能代表所有类型   枚举的值,无范围枚举类型的prvalue   可以转换为具有最低值的扩展整数类型的prvalue   整数转换等级(4.13)大于长长的等级   其中可以表示枚举的所有值。如果有   是两种这样的扩展类型,选择签名的类型。

答案 1 :(得分:2)

  

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

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

  

是否有一些关于积分促销的特殊规则?

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