C++枚举类型是否从0开始?

70
如果我的枚举(enum)没有为其枚举值指定数字,它的序数值是否为0?例如:
enum enumeration { ZERO,
                   ONE,
                   TWO,
                   THREE,
                   FOUR,
                   FIVE,
                   SIX,
                   SEVEN,
                   EIGHT,
                   NINE };

我找到了一篇文章引用C99标准需要0序数,但我知道C++忽略了C99标准中的几件事情。我也找到了一篇文章证明编译器使用序数1的值,我好像也记得以前看过这个,但我无法确定是多久之前。

我真的很想看到一个确认C++问题的答案,但我也想知道,即使我在enum中间指定了一个值,序数0是否仍然有效:

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

3
下一个枚举常量的值将始终与列表中前一个常量的值相同。因此,在您的情况下,您将获得“0、1、2、13、14、15...”。请注意,这可能会创建重复项。 - Lundin
@Jonathan Mee 如果C++中的枚举器与C不同,不从0开始将会非常奇怪。 :) - Vlad from Moscow
@VladfromMoscow 我同意,显然从答案来看是这样的。我只是找不到任何保证 C++ 的东西。如果不需要的话,我不想继续指定序数 0 :S - Jonathan Mee
我非常确定这个规则在C99中没有改变。也就是说,它从C开始就是这样的。 - Nicol Bolas
3个回答

69

根据[dcl.enum]标准,使用enum关键字声明的枚举类型是非作用域枚举类型,它的枚举值是非作用域枚举器。enum class和enum struct是语义上等价的;使用它们之一声明的枚举类型是作用域枚举类型,它的枚举值是作用域枚举器。在声明作用域枚举时,不能省略可选标识符。enum-base的类型指定符序列必须命名为整数型;任何cv-qualification都将被忽略。一个声明非作用域枚举的不透明enum-declaration不能省略enum-base。枚举器列表中的标识符被声明为常量,并且可以出现在需要常量的任何位置。带有=的enumerator-definition给定了常量表达式所指示的相关enumerator的值。如果第一个枚举器没有初始化程序,则相应常量的值为零。没有初始化程序的枚举器定义使得枚举器的值通过将前一个枚举器的值增加一得到。

重点强调

因此,如果您未指定开始值,则默认为0。

引用:

我真的很想看到一个确认C++的答案,但我也想知道如果我在枚举的中间指定一个值,0是否仍然有效:

这也是有效的。它将从0开始逐步增加。然后,在为枚举器分配值之后,它将从该值开始每次递增1。


类似于C语言:https://dev59.com/I2w15IYBdhLWcg3wu-I9 - Ciro Santilli OurBigBook.com

33

从C++11规格说明(7.2/2):

如果第一个枚举成员没有初始化器,则相应常量的值为零。没有初始化器枚举定义将前一个枚举成员的值增加一赋予给当前枚举成员

因此,是的,在枚举中第一个标识符的值为零(如果它没有显式初始化为另一个值),而每个连续的标识符的值为前一个标识符的值加上一。


8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接