当我们有,
struct E { enum E_ { HELLO }; }; // 'E' is inheritable
然后我们为什么需要,
enum class E { HELLO }; // 'E' is not inheritable
IMO第二版不提供比第一版更多的功能。我不认为引入enum class
只是为了保存2个花括号{};
!我错过了任何重要方面吗?
作为一个小问题,enum class
和enum struct
除语法之外是否有任何区别(因为两者都有public
访问说明符)?
答案 0 :(得分:125)
除了已经提到的内容之外,enum class
的一个优点是更好类型安全 - enum class
枚举器不会隐式转换为整数。
答案 1 :(得分:93)
我们真的需要C ++ 0x中的“枚举类”吗?
不,我们不“需要”enum class
。我们可以通过其他方式获得足够的等效功能。但按照这种逻辑,我们并不需要C ++中的很多东西。我们不需要“虚拟功能和继承”,因为我们可以使用vtable等手动实现它。我们不“需要”成员职能;这些可以通过让他们进行额外的论证来模仿。
存在语言功能,使程序员的生活更轻松。仅仅因为可以手动完成,并不意味着它应该。
enum class
具有以下属性:
enum class
可能看起来有点奇怪,但大多数新功能都是如此。一旦你习惯了它,没关系。enum class
定义的效果。如果没有这个宏,你必须花费相当多的努力才能使所有的角落情况都能发挥作用。即便如此,某人必须编写并调试该宏。所以不,我们不“需要”它们。但它们仍然是这种语言的一个很好的补充。
答案 2 :(得分:24)
在第一种情况下,HELLO
的类型不是E
,而在第二种情况下,HELLO
的类型是E
。
为了很好地证明这一点很重要,请参阅Howard Hinnant对"“enum class” emulation or solid alternative for MSVC 10.0."的回答
根据C ++ 0xFDIS§7.2/ 2, enum class
和enum struct
在“语义上等效”(即相同)。
答案 3 :(得分:16)
我认为你需要阅读这些新枚举的其他优点
答案 4 :(得分:2)
是的,我们这样做。看起来之前没有人指出这一点。如果你需要设置enum
的大小并按照C ++标准保持静止呢? enum class
可以做到。并且已经提到了类型安全。它减少了代码中可能存在的错误以及混合int
和enum
的混乱。他们对我来说并不是一回事。惊人。例如,enum class foo : int16_t { ... }
我确定每个成员都是int16_t
,而不是实施决定什么对我来说“更好”。
修改强>
此外,我们可以在列表中包含重复的值(而不是名称)。根据上下文,这很有意义。