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

iam*_*ind 60 c++ enums language-lawyer c++11

我们的时候,

struct E { enum E_ { HELLO }; }; // 'E' is inheritable
Run Code Online (Sandbox Code Playgroud)

那我们为什么需要,

enum class E { HELLO };  // 'E' is not inheritable
Run Code Online (Sandbox Code Playgroud)

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

作为未成年人的问题,是有什么区别enum classenum struct其他比语法(因为两者都具有public访问说明符)?

Kos*_*Kos 125

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


Nic*_*las 93

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

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

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

enum class 具有以下属性:

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

所以不,我们不"需要"它们.但它们仍然是语言的一个很好的补充.

  • Bravo,这也适用于任何领域的任何领域的每一项改进. (11认同)
  • +1.为了说明问题更加明显:"你也不需要**穿裤子,但如果不这样做,你的生活可能会更难." (2认同)

Jam*_*lis 24

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

为了更好地证明这一点很重要,请参阅Howard Hinnant对"枚举类"仿真或MSVC 10.0的可靠替代方案的回答.

enum classenum struct根据C++ 0xFDIS§7.2/ 2 ,它们是"语义等价的"(即相同).

  • 是的,它绝对值得:它是一种小型的,自包含的语言,可以更清晰地使用枚举并替换许多kludges(其中许多是不正确的).它不像rvalue引用,lambda表达式或可变参数模板那样改变游戏,但这并不意味着它不是一个有用的功能. (4认同)

Dav*_*vid 16

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

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

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