我们真的需要C ++ 11中的“枚举类”吗?

时间:2011-08-04 03:59:42

标签: c++ enums c++11 language-lawyer

当我们有,

struct E { enum E_ { HELLO }; }; // 'E' is inheritable

然后我们为什么需要,

enum class E { HELLO };  // 'E' is not inheritable

IMO第二版不提供比第一版更多的功能。我不认为引入enum class只是为了保存2个花括号{};!我错过了任何重要方面吗?

作为一个小问题,enum classenum struct除语法之外是否有任何区别(因为两者都有public访问说明符)?

5 个答案:

答案 0 :(得分:125)

除了已经提到的内容之外,enum class的一个优点是更好类型安全 - enum class枚举器不会隐式转换为整数。

答案 1 :(得分:93)

  

我们真的需要C ++ 0x中的“枚举类”吗?

不,我们不“需要”enum class。我们可以通过其他方式获得足够的等效功能。但按照这种逻辑,我们并不需要C ++中的很多东西。我们不需要“虚拟功能和继承”,因为我们可以使用vtable等手动实现它。我们不“需要”成员职能;这些可以通过让他们进行额外的论证来模仿。

存在语言功能,使程序员的生活更轻松。仅仅因为可以手动完成,并不意味着它应该。

enum class具有以下属性:

  1. 很容易理解;它反映了枚举在其他语言中的运作方式。
  2. 编译器编写者需要的资源相对较少。将实现工作与r值引用,varadic模板或用户定义的文字等功能进行对比。
  3. 它不会以任何方式破坏语法。一开始看enum class可能看起来有点奇怪,但大多数新功能都是如此。一旦你习惯了它,没关系。
  4. 它是100%向后兼容的,因为它不会重新定义常规枚举的工作方式。旧式枚举与以往一样。
  5. 它使您不必编写大量的样板代码。 Boost有一个宏来创建enum class定义的效果。如果没有这个宏,你必须花费相当多的努力才能使所有的角落情况都能发挥作用。即便如此,某人必须编写并调试该宏。
  6. 所以不,我们不“需要”它们。但它们仍然是这种语言的一个很好的补充。

答案 2 :(得分:24)

在第一种情况下,HELLO的类型不是E,而在第二种情况下,HELLO的类型是E

为了很好地证明这一点很重要,请参阅Howard Hinnant对"“enum class” emulation or solid alternative for MSVC 10.0."的回答

根据C ++ 0xFDIS§7.2/ 2,

enum classenum struct在“语义上等效”(即相同)。

答案 3 :(得分:16)

我认为你需要阅读这些新枚举的其他优点

  • 用户定义的尺寸
  • 范围值(不再是一般范围填写值)
  • 没有隐式转换为整数类型
  • 枚举的前向声明(API中枚举的最大改进)

http://www.stroustrup.com/C++11FAQ.html#enum

答案 4 :(得分:2)

是的,我们这样做。看起来之前没有人指出这一点。如果你需要设置enum的大小并按照C ++标准保持静止呢? enum class可以做到。并且已经提到了类型安全。它减少了代码中可能存在的错误以及混合intenum的混乱。他们对我来说并不是一回事。惊人。例如,enum class foo : int16_t { ... }我确定每个成员都是int16_t,而不是实施决定什么对我来说“更好”。

修改

此外,我们可以在列表中包含重复的值(而不是名称)。根据上下文,这很有意义。