新的类型安全枚举是否定义为从 0 开始
Are the new typesafe enums defined to begin at 0?
给定以下 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 class
和enum struct
在语义上是等效的; 使用其中一个声明的枚举类型是作用域 枚举及其枚举器是作用域枚举器。[...]如果 第一个枚举器没有初始值设定项,对应的值 常量为零。[...]
枚举值的初始化没有改变:除非你给出不同的初始值,否则它们将从零开始,并从以前的值开始计数。相关部分在 7.2 [dcl.enum] 第 2 段中:
如果第一个枚举器没有初始值设定项,则相应常量的值为零。不带初始值设定项的枚举器定义为枚举器提供通过将前一个枚举器的值增加 1 而获得的值。
是的,他们是。它在 §7.2/2 中:
[...]如果第一个枚举器没有初始值设定项,则相应常量的值为零。不带初始值设定项的枚举器定义为枚举器提供通过将前一个枚举器的值增加 1 而获得的值。
本节涵盖enum class
声明和常规enum
声明
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 当回溯以零开始时,如何调试崩溃
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 重写自定义数组类的运算符/开始/结束
- 新的类型安全枚举是否定义为从 0 开始
- 如何开始使用自定义 GUI 小部件
- 使用机器学习自动更正自定义句子的应用程序:如何开始