C ++枚举从0开始?

时间:2016-01-15 12:50:38

标签: c++ enums language-lawyer enumeration ordinal

如果我的enum没有为枚举分配数字,它的序数值是否为0?例如:

enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };

我找到了post citing that the C99 standard requires a 0 ordinal number。但我知道C ++忽略了C99标准中的几个方面。而且我也能找到一个post witnessing the compiler using an ordinal value of 1,这也是我似乎也记得的东西,虽然我不知道多久以前就是这样。

我真的希望看到一个为C ++确认这个问题的答案,但我也想知道序数0是否包含,即使我在{{中间指定了一个值} 1}}:

enum

3 个答案:

答案 0 :(得分:40)

按照该标准[dcl.enum]

  

使用枚举仅使用枚举声明的枚举类型是未作用域的枚举,其枚举数是未作用域的枚举数。 enum-keys枚举类和枚举结构在语义上是等价的;使用其中一个声明的枚举类型是作用域枚举,其枚举数是作用域的   统计员。在范围枚举的声明中不应省略可选标识符。枚举的类型说明符-seq应命名为整数类型;任何cv资格都被忽略了。声明无范围枚举的opaqueenum声明不得省略枚举。枚举器列表中的标识符声明为常量,并且可以出现在需要常量的位置。带有=的枚举器定义为关联的枚举器提供由constant-expression指示的值。 如果是第一个   枚举器没有初始化器,相应常量的值为零。没有初始化器的枚举器定义为枚举器提供了通过将前一个枚举器的值增加1而获得的值。

强调我的

所以如果您没有指定起始值,则默认为0。

  

我真的希望看到一个确认C ++的答案,但我也想知道即使我在枚举的中间指定一个值,序数0是否成立:

这也有效。它将从0开始并沿途增加。然后在枚举之后,为它分配值将从下一个的值开始增加。

答案 1 :(得分:23)

从C ++ 11规范(7.2 / 2):

  

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

所以是的,枚举中的第一个标识符的值为零(如果它没有显式初始化为另一个值),并且每个连续的标识符将具有前一个加1的值。

答案 2 :(得分:6)

来自§7.2,第165页

  

。如果第一个枚举器没有初始化器,则相应常量的值为零

来源:http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf