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

Are the new typesafe enums defined to begin at 0?

本文关键字:开始 定义 是否 类型安全 枚举      更新时间:2023-10-16

给定以下 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 的枚举作为第一项的值?

当涉及到未指定初始值设定项的第一个枚举项的值时,该标准不会区分作用域枚举和非作用域枚举。

来自 §7.2/2 [dcl.enum]

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

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

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

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

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

本节涵盖enum class声明和常规enum声明