我们真的需要C ++ 11中的“枚举类”吗?
当我们有,
struct E { enum E_ { HELLO }; }; // 'E' is inheritable
那为什么我们需要,
enum class E { HELLO }; // 'E' is not inheritable
国际海事组织第二版不提供更多的function比第一。 我不认为引入enum class
只是为了节省2个大括号{};
! 我错过了任何重要的方面?
作为一个小问题,是除了语法之外的enum class
和enum struct
之间有任何区别(因为都有public
访问说明符)?
除了已经提到的, enum class
的优点是更好的types安全性 – enum class
枚举器不会隐式转换为整数。
我们真的需要C ++ 0x中的“枚举类”吗?
不,我们不需要“需要” enum class
。 我们可以通过其他方式获得足够等效的function。 但是通过这个逻辑,我们并不需要C ++中的很多东西。 我们不需要“虚拟函数和inheritance”,因为我们可以用vtables等手工实现它。 我们不需要“成员”function; 这些可以通过让他们采取额外的论据来模拟。
语言function的存在,使程序员生活更容易。 只是因为可以手动完成的事情并不意味着它应该。
enum class
具有以下属性:
- 这很容易理解; 它反映了枚举如何在其他语言中工作。
- 编译器编写者所需的资源相对较less。 将实现工作与r值引用,可变模板或用户定义文字等function进行对比。
- 它不以任何方式破坏语法。 看到
enum class
,看起来enum class
,但对于大多数新function来说,这是真实的。 一旦你习惯了,没关系。 - 它是100%向后兼容,因为它不重新定义常规枚举如何工作。 旧样式的枚举与以前一样工作。
- 它使你不必写许多样板代码。 Boost有一个macros来创build
enum class
定义的效果。 如果没有这个macros,你必须付出相当的努力才能使所有的angular落案例都能正常工作。 即使如此, 有人不得不编写和debuggingmacros。
所以不,我们不“需要”他们。 但他们仍然是语言的一个很好的补充。
在第一种情况下, HELLO
的types不是E
,而在第二种情况下, HELLO
的types是E
为了更好地certificate为什么这很重要,请参阅Howard Hinnant 对MSVC 10.0的“枚举类”模拟或固体替代方法的回答。
enum class
和enum struct
是“语义等价”(即相同),每C ++ 0x FDIS§7.2/ 2。
我想你需要阅读这些新枚举的其他优点
- 用户定义的大小
- 有限范围的值(不再有一般的值范围)
- 没有隐式转换为整型
- 预先声明枚举(API中枚举的最大改进)
是的,我们这样做。 看起来没有人指出过。 如果你需要设置一个enum
大小,并保持按照C + +标准保持不变? enum class
可以做。 和types安全性已经提到。 它减less了代码中的很多可能的错误,以及混合int
和enum
的混乱。 对我来说,这不是一回事。 惊人。 例如, enum class foo : int16_t { ... }
我敢肯定,每个成员是一个int16_t
而不是执行决定什么是对我来说“更好”。
编辑:
另外,我们可以在列表中有重复的值(不是名字)。 这取决于上下文有很大的意义。