62

当我们有,

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访问说明符)?

4

5 回答 5

127

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

于 2011-08-04T07:10:32.560 回答
94

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

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

语言特性的存在使程序员的生活更轻松。仅仅因为可以手动完成某些事情并不意味着它应该这样做。

enum class具有以下属性:

  1. 很容易理解;它反映了枚举在其他语言中的工作方式。
  2. 它对编译器编写者的要求相对较少。将实现工作与 r 值引用、可变参数模板或用户定义的文字等功能进行对比。
  3. 它不会以任何方式破坏语法。乍一看可能有点奇怪enum class,但对于大多数新功能来说都是如此。习惯了就好了。
  4. 它是 100% 向后兼容的,因为它不会重新定义常规枚举的工作方式。旧式枚举的工作方式与以前相同。
  5. 它使您不必编写大量样板代码。Boost 有一个宏来创建enum class定义的效果。如果没有这个宏,你必须花费相当多的精力来让所有的极端情况都能正常工作。即便如此,也必须有人编写和调试该宏。

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

于 2011-08-04T07:00:01.890 回答
24

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

有关为什么这很重要的一个很好的演示,请参阅 Howard Hinnant 对““枚举类”仿真或 MSVC 10.0 的可靠替代方案的回答。

enum class并且enum struct根据 C++0x FDIS §7.2/2 是“语义等价的”(即相同)。

于 2011-08-04T04:03:08.903 回答
16

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

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

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

于 2011-08-04T13:24:21.020 回答
1

是的,我们有。以前好像没有人指出过这一点。如果您需要enum根据 C++ 标准设置大小并保持静止,那该怎么办?enum class可以做。并具有前面提到的类型安全性。它减少了代码中很多可能的错误以及混合intenums 的混乱。他们对我来说从来都不是一回事。惊人的。例如,enum class foo : int16_t { ... }我确信每个成员都是一个int16_t而不是由实施决定什么对我来说“更好”。

编辑:

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

于 2014-03-19T17:04:24.807 回答