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

C++ 表达式中使用的枚举数的类型是否与其枚举的基础类型相同?,c++,enums,enumeration,enumerator,integer-promotion,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

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

考虑以下代码:

#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;
}
现在,如果我只将某个其他枚举数的值,
begin
更改为
2147483648
,那么我的输出将变为:

true
4
4294967197
显然,这意味着,
end
的类型已从
int
更改为
unsigned int
,甚至
模式的基本类型仍然相同(即
unsigned int

<关于EnnS的积分促销有什么特殊的规则吗?

< P>从C++标准(7.2枚举声明)

  • …在枚举说明符的右括号之后,每个枚举数都有其枚举的类型。
  • 和(4.5整体促销)

    3基础类型为的非范围枚举类型的prvalue
    不固定(7.2)可转换为 以下类型可以表示枚举的所有值 (即7.2中所述的bmin至bmax范围内的值):int, 无符号整型、长整型、无符号长整型、长整型或无符号整型 long long int。如果该列表中的任何类型都不能表示所有 枚举的值,非范围枚举类型的prvalue
    可以转换为具有最小值的扩展整数类型的prvalue 整数转换秩(4.13)大于中long的秩 它可以表示枚举的所有值。如果有 如果有两个这样的扩展类型,则选择有符号的类型

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

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

    对于Enum积分促销是否有一些特殊规则


    不是真的。您正在考虑enum的底层类型的整体升级,但这是不同的。对于枚举类型本身,需要考虑枚举类型的有效值范围,该范围可以小于枚举基础类型的有效值范围。能否
    int
    表示所有有效值?如果是这样,您将从中获得一个
    int

    “可以转换为以下第一种类型的prvalue,该类型可以表示枚举的所有值”。这正是我想要的。非常感谢。
    true
    4
    4294967197