给出以下C++ 11代码
enum class Foods {
Apple,
Pear,
Banana
};
Run Code Online (Sandbox Code Playgroud)
将
std::cout << (unsigned int)Foods::Apple << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出0?
这对于MSVC 2012和gcc 4.7.0都是如此,但是我对C++ 11标准指定的内容更感兴趣.也就是说,可移植代码是否可以依赖枚举默认为0来表示第一项的值?
当涉及未指定初始化器的第一个枚举器的值时,该标准不区分范围和未范围的枚举.
来自§7.2/ 2 [dcl.enum]
仅使用枚举键声明的枚举类型
enum是未作用域的枚举,其枚举数是未作用域的枚举数.在枚举密钥enum class和enum struct在语义上等价; 使用其中一个声明的枚举类型是作用域枚举,其枚举器是作用域枚举器.[...] 如果第一个枚举器没有初始化器,则相应常量的值为零.[...]
枚举值的初始化没有改变:除非你给出不同的初始值,否则它们将从零开始并从前一个值开始计数.相关部分见7.2 [dcl.enum]第2段:
如果第一个枚举器没有初始化器,则相应常量的值为零.没有初始值设定项的枚举器定义为枚举数提供了通过将前一个枚举数的值增加1而获得的值.