C++ 枚举从 0 开始吗?

问题描述 投票:0回答:3

如果我有一个

enum
没有为枚举分配数字,那么它的序数值会是 0 吗?例如:

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

我找到了一篇帖子,指出 C99 标准需要 0 序数。但我知道 C++ 忽略了 C99 标准中的几件事。而且我还找到了一篇 见证编译器使用序数值 1 的文章,我似乎也记得看到过,尽管我不能说那是多久以前的事了。

我真的很想看到一个在 C++ 中证实这一点的答案,但我也想知道序数 0 是否成立 即使我在

enum
中间指定了一个值:

enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE = 13,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };
c++ enums language-lawyer enumeration ordinal
3个回答
70
投票

根据该标准 [dcl.enum]

使用仅 enum 的 enum-key 声明的枚举类型是无作用域枚举,其枚举器也是无作用域枚举器。 enum-keys 枚举类和枚举结构在语义上是等效的;使用其中之一声明的枚举类型是有作用域的枚举,并且其枚举器是有作用域的 枚举器。在作用域枚举的声明中不得省略可选标识符。枚举基的类型说明符序列应命名整型;任何简历资格都会被忽略。声明无作用域枚举的 opaqueenum 声明不得省略 enum-base。枚举器列表中的标识符被声明为常量,并且可以出现在需要常量的地方。带有 = 的枚举器定义为关联的枚举器提供常量表达式指示的值。 如果是第一个 枚举器没有初始化器,相应常量的值为零。 没有初始化器的枚举器定义为枚举器提供通过将前一个枚举器的值加一获得的值。

强调我的

所以是的,如果您不指定起始值,它将默认为 0。

我真的很想看到一个在 C++ 中证实这一点的答案,但我也想知道即使我在枚举中间指定一个值,序数 0 是否成立:

这也有效。它将从 0 开始并一路递增。然后,在枚举之后,您为其分配的值将开始为后续枚举器的该值加一。


33
投票

来自 C++11 规范 (7.2/2):

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

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


8
投票

来自第 7.2 节,第 165 页

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

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

© www.soinside.com 2019 - 2024. All rights reserved.