枚举常量的类型是什么,当它在未作用域的枚举定义之外使用时?
请考虑以下代码:
#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
})。
关于枚举的整体促销是否有一些特殊规则?
答案 0 :(得分:7)
来自C ++标准(7.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
。