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