定义的新类型安全枚举是否从0开始?

给定以下C++ 11代码定义的新类型安全枚举是否从0开始?

enum class Foods { 

Apple,

Pear,

Banana

};

std::cout << (unsigned int)Foods::Apple << std::endl; 

输出0?

这对于MSVC 2012和gcc 4.7.0是正确的,但是我对C++ 11标准指定的内容更感兴趣。也就是说,便携式代码可以依赖于第一项的值默认为0的枚举吗?

回答:

是的,他们是。它在§7.2/ 2中:

[...]如果第一个枚举器没有初始化器,则相应常量的值为零。没有初始化器的枚举器定义为枚举器提供通过将前一个枚举器的值增加1而获得的值。你为什么要使用类型安全的枚举

本节涵盖enum class声明和定期enum声明

回答:

枚举值的初始化没有改变:除非您给出不同的初始值,否则它们将从零开始并从先前的值开始向上计数。相关部分在7.2 [dcl.enum]第2段中:

如果第一个枚举数没有初始值设定项,则对应常量的值为零。没有初始化器的枚举器定义为枚举器提供通过将前一个枚举器的值增加1而获得的值。

回答:

当涉及到不指定初始化程序的第一个枚举数的值时,该标准没有区分有范围和无范围的枚举。

从§7.2/ 2 [dcl.enum]

仅为enum一个枚举密钥声明的枚举类型是 无作用域枚举,其统计员无作用域统计员枚举键enum classenum struct在语义上是等价的; 与这些一个所声明的一个枚举类型是作用域 枚举,其统计员作用域枚举。 [...] 如果 第一枚举没有初始化,相应 常数的值是零。 [...]

以上是 定义的新类型安全枚举是否从0开始? 的全部内容, 来源链接: utcz.com/qa/261506.html

回到顶部