给定以下C++ 11代码定义的新类型安全枚举是否从0开始?
enum class Foods {
Apple,
Pear,
Banana
};
将
std::cout << (unsigned int)Foods::Apple << std::endl;
输出0?
这对于MSVC 2012和gcc 4.7.0是正确的,但是我对C++ 11标准指定的内容更感兴趣。也就是说,便携式代码可以依赖于第一项的值默认为0的枚举吗?
给定以下C++ 11代码定义的新类型安全枚举是否从0开始?
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中:
[...]如果第一个枚举器没有初始化器,则相应常量的值为零。没有初始化器的枚举器定义为枚举器提供通过将前一个枚举器的值增加1而获得的值。你为什么要使用类型安全的枚举
本节涵盖enum class
声明和定期enum
声明
枚举值的初始化没有改变:除非您给出不同的初始值,否则它们将从零开始并从先前的值开始向上计数。相关部分在7.2 [dcl.enum]第2段中:
如果第一个枚举数没有初始值设定项,则对应常量的值为零。没有初始化器的枚举器定义为枚举器提供通过将前一个枚举器的值增加1而获得的值。
当涉及到不指定初始化程序的第一个枚举数的值时,该标准没有区分有范围和无范围的枚举。
从§7.2/ 2 [dcl.enum]
仅为
enum
一个枚举密钥声明的枚举类型是 无作用域枚举,其统计员是无作用域统计员。 枚举键enum class
和enum struct
在语义上是等价的; 与这些一个所声明的一个枚举类型是作用域 枚举,其统计员是作用域枚举。 [...] 如果 第一枚举没有初始化,相应 常数的值是零。 [...]
如果你关心自己的整数表示呢? – Pubby
@Pubby,以免不必要地污染命名空间。类型安全枚举也适用于作用域。除此之外,我比其他任何事都更好奇。 – nixeagle
好吧,三个很好的答案都说同样的事情。我提高了所有这些,现在我接受了!我想我会接受明天最富有的人。 :) – nixeagle