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

当我们有,

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

那为什么我们需要,

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

国际海事组织第二版不提供更多的function比第一。 我不认为引入enum class只是为了节省2个大括号{}; ! 我错过了任何重要的方面?

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

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

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

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

语言function的存在,使程序员生活更容易。 只是因为可以手动完成的事情并不意味着它应该。

enum class具有以下属性:

  1. 这很容易理解; 它反映了枚举如何在其他语言中工作。
  2. 编译器编写者所需的资源相对较less。 将实现工作与r值引用,可变模板或用户定义文字等function进行对比。
  3. 它不以任何方式破坏语法。 看到enum class ,看起来enum class ,但对于大多数新function来说,这是真实的。 一旦你习惯了,没关系。
  4. 它是100%向后兼容,因为它不重新定义常规枚举如何工作。 旧样式的枚举与以前一样工作。
  5. 它使你不必写许多样板代码。 Boost有一个macros来创buildenum class定义的效果。 如果没有这个macros,你必须付出相当的努力才能使所有的angular落案例都能正常工作。 即使如此, 有人不得不编写和debuggingmacros。

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

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

为了更好地certificate为什么这很重要,请参阅Howard Hinnant 对MSVC 10.0的“枚举类”模拟或固体替代方法的回答。

enum classenum struct是“语义等价”(即相同),每C ++ 0x FDIS§7.2/ 2。

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

  • 用户定义的大小
  • 有限范围的值(不再有一般的值范围)
  • 没有隐式转换为整型
  • 预先声明枚举(API中枚举的最大改进)

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

是的,我们这样做。 看起来没有人指出过。 如果你需要设置一个enum大小,并保持按照C + +标准保持不变? enum class可以做。 和types安全性已经提到。 它减less了代码中的很多可能的错误,以及混合intenum的混乱。 对我来说,这不是一回事。 惊人。 例如, enum class foo : int16_t { ... }我敢肯定,每个成员是一个int16_t而不是执行决定什么是对我来说“更好”。

编辑:

另外,我们可以在列表中有重复的值(不是名字)。 这取决于上下文有很大的意义。