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

时间:2012-11-19 23:39:57

标签: c++ enums c++11

给出以下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来表示第一项的值?

3 个答案:

答案 0 :(得分:6)

当涉及未指定初始值设定项的第一个枚举数的值时,该标准不区分范围和未范围的枚举。

来自§7.2/ 2 [dcl.enum]

  

使用仅仅enum枚举键声明的枚举类型是   unscoped枚举,其枚举器 unscoped枚举器。   枚举键 enum classenum struct在语义上是等效的;   使用其中一个声明的枚举类型是作用域   枚举及其枚举器范围的枚举器。 [...] 如果   第一个枚举器没有初始值设定项,相应的值   常数为零。 [...]

答案 1 :(得分:5)

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

  

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

答案 2 :(得分:4)

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

  

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

本节介绍enum class声明和常规enum声明