给定以下 C++11 代码
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 [dcl.enum]
用only的枚举键声明的枚举类型
enum
是一个无作用域的枚举,它的枚举器是无作用域的枚举器。枚举键enum class
和在enum struct
语义上是等价的;用其中之一声明的枚举类型是作用域枚举,它的枚举器是作用域枚举器。[...]如果第一个枚举器没有初始化器,则相应常量的值为零。[...]
枚举值的初始化没有改变:除非您给出不同的初始值,否则它们将从零开始并从前一个值开始计数。相关部分在 7.2 [dcl.enum] 第 2 段中:
如果第一个枚举器没有初始化器,则相应常量的值为零。没有初始化器的枚举器定义为枚举器提供了通过将前一个枚举器的值增加一而获得的值。
是的,他们是。它在第 7.2/2 节中:
[...]如果第一个枚举器没有初始化器,则相应常量的值为零。没有初始化器的枚举器定义为枚举器提供了通过将前一个枚举器的值增加一而获得的值。
本节涵盖enum class
声明和常规enum
声明