传统的枚举存在一些问题,其中之一是两个枚举定义中的枚举量可能发生冲突:
enum egg {Small , Medium , Large , Jumbo};
enum t_shirt {Small , Medium , Large , Jumbo};
这将无法通过编译,因为egg Small和t_shirt Small位于相同的作用域内,它们将发生冲突。为避免这种问题,C++11提供了一种新枚举,其枚举量的作用域为类。这种枚举的声明类似于下面这样:
enum class egg {Small , Medium , Large , Jumbo};
enum class t_shirt {Small , Medium , Large , Jumbo};
也可使用关键字struct代替class。无论使用哪种方式,都需要使用枚举名来限定枚举量:
egg choice = egg::Large;
t_shirt Floyd = t_shirt::Large;
在有些情况下,常规枚举将自动转换为整型,但作用域内枚举不能隐式地转换为整型,必须显式转换:
enum egg {Small , Medium , Large , Jumbo};
enum class t_shirt {Small , Medium , Large , Jumbo};
egg one = Small;
t_shirt two = t_shirt::Small;
int king = one;//OK
int ring = two;//NOK
默认情况下,C++11作用域内枚举的底层类型为int。也可以显式的改动底层类型:
enum class : short pizza {Small,Medium};
:short将底层类型指定为short,但指定的底层类型必须为整型。