C++枚举从0开始?

Jon*_*Mee 48 c++ enums enumeration ordinal language-lawyer

如果我有一个enum不为枚举分配数字,它的序数值是0吗?例如:

enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };
Run Code Online (Sandbox Code Playgroud)

我已经能够找到一篇文章,引用C99标准需要一个0序数.但我知道C++忽略了C99标准中的几个方面.而且我也能找到一个见证编译器使用序数值为1帖子,这也是我似乎记得看到的,虽然我不知道多久以前就是这样.

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

enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE = 13,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };
Run Code Online (Sandbox Code Playgroud)

Nat*_*ica 46

根据该标准[dcl.enum]

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

强调我的

所以如果您没有指定起始值,它将默认为0.

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

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


Som*_*ude 26

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

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

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


Ric*_*ges 6

来自§7.2,第165页

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

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