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

Does enumerator used in expression have the same type as underlying type of its enum?

本文关键字:类型 枚举 表达式 是否      更新时间:2023-10-16

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

请考虑以下代码:

#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++标准(7.2枚举声明(

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

和(4.5 积分促销(

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

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

当然,这是枚举类型。begin的类型是modes.如果它有一个积分类型,你关于枚举积分提升的问题就没有意义了。

使用枚举进行积分促销是否有一些特殊规则?

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