作用域内枚举(C++11)
传统的枚举存在一些问题,其中之一是两个枚举定义中的枚举量可能发生冲突。假设有一个处理鸡蛋和T恤的项目,其中可能包含类似下面这样的代码: enum egg {Small, Medium, Large, Jumbo}; enum t_shirt {Small, Medium, Large , Xlarge}; 这将无法通过编译,因为egg Small 和t_shirt Small位于相同的作用域内,它们将发生冲突。为避免这种问题,C++11提供了一种新枚举,其枚举量的作用域为类。这种枚举的声明类似于下面这样: enum class egg {Small, Medium, Large, Jumbo}; enum class t_shirt {Small, Medium, Large, Xlarge};
也可以使用关键字struct代替class。无论使用哪种方式,都需要使用枚举名来限定枚举量: egg choice = egg::Large; t_shirt Floyd = t_shirt :: Large; 枚举量的作用域为类后,不同枚举定义中的枚举量就不会发生名称冲突了。 C++11还提高了作用域内枚举的类型安全。在有些情况下,常规枚举将自动转换为整型,如将其赋给int变量或用于比较表达式时,但作用域内枚举不能隐式地转换为整型: enum egg_old { Small, Medium, Large, Jumbo}; //unscoped enum class t_shirt {Small, Medium, Large, Xlarge}; //scoped egg_old one = Medium; //unscoped t_shirt rolf = t_shirt::Large; //scoped int king = one; //implicit type conversion for unscoped int ring = rolf; //not allowed, no implicit type conversion if(king < Jumbo) //allowed std:;cout<<”Jumbo converted to int before comparison. ”; if(king < t_shirt::Medium) //not allowed std::cout<<”Not allowed: <not defined for scoped enum. ”; 但在必要时,可进行显示类型转换: int Frodo = int (t_shirt :: Small); //Frodo set to 0 枚举用某种底层整型类型表示,在C++98中,如何选择取决于实现,因此包含枚举的结构的长度可能随系统而异。对于作用域内枚举,C++11消除了这种依赖性。默认情况下,C++11作用域内枚举的底层类型为int,另外,还提供了一种语法,可用于坐出不同的选择: //underlying type for pizza is short enum class : short pizza { Small, Medium, Large, XLarge}; :short 将底层类型指定为short。底层类型必须为整型。在C++11中,也可使用这种语法来指定常规枚举的底层类型,但如果没有指定,编译器选择的底层类型将随实现而异。
By——Suki From 《C++ Primer Plus》