什么是枚举类,我为什么要关心?

sbi*_*sbi 6 c++ enums c++11 enum-class

对于一个从未写过一行C++ 11,并且目前没有机会用C++ 11编程的人,你能用一个简短的段落告诉我:

什么是"枚举类",为什么我们需要它?

Pot*_*ter 13

enum class被称为范围枚举.它可以防止使用枚举器的名称污染枚举的名称空间.

在C++ 03中,你可以通过将enum内部设置为专用来有效地完成相同的操作class.也许这是语法的来源,这有点令人困惑.

另一个区别是这种类型的枚举器不会隐式转换为int(static_cast<int>是必需的).这可能很少需要,但它使得int使用一种enum类型的参数的函数重载是安全的.您可以确定int不会被意外调用.或者您可以使用专用operator函数定义伪积分类型,并确保内置运算符不会干扰.

令人讨厌的是,这两个不相关的差异出现在同一个包中,并且您无法获得没有隐式转换的无范围枚举,但通常这两个更改都是Good Things,并且enum class在C++ 11中是一个很好的默认实践.

编辑:范围枚举定义如下:

enum class duck { huey, dewey, louie };
Run Code Online (Sandbox Code Playgroud)

并且必须与范围解析运算符一起使用,::如下所示:

duck culprit = duck::huey; // or "auto culprit" to avoid redundancy
Run Code Online (Sandbox Code Playgroud)

请注意,::运算符也适用于C++ 03无范围枚举,因此即使第一行丢失,上面的第二行也能正常工作class.

这可能是过多的细节,但如果转发声明枚举类型,class则不会进入详细类型说明符,如

void quack( enum duck whom ); // not "enum class"
Run Code Online (Sandbox Code Playgroud)

但是,在C++ 11中有一个new构造,即opaque-enum-declaration,它包含class关键字并定义一个完整的类型.

enum duck; // duck is declared as incomplete type
enum class duck; // duck is now complete type; underlying type defaults to int
Run Code Online (Sandbox Code Playgroud)

struct可以替换关键字class而没有语义差异.