首先通过两行代码了解,什么是限定作用域的枚举类型,什么是不限作用域的枚举类型。
优先使用限定作用域的枚举类型的原因有三个:
1、降低名字空间污染。防止枚举值名称与变量名冲突。
2、枚举量是更强类型的,禁止其向其他类型的隐式转换,除非使用static_cast关键字强制类型转换。
3、可以直接进行前置声明
关于不限作用域的枚举类型不能前置声明的原因,这里简单介绍一下:为了能够表达出不限作用域的枚举类型区间,编译器通常会为枚举类型选用足够表示其区间的类型作为其底层实现,例如,如果枚举值是1~10,那使用short就可以完成,但是这时候又向其中新加了一个值0xFFFFFFFF,那编译器不得不改用long来表示,注意,此时所有使用该枚举值的地方将都会重新编译,所以由于无法知道不限作用域的枚举类型的底层实现,所以也就无法为其分配空间,也就无法前置声明。而限定作用域的枚举类型可以前置声明的原因是,其默认的使用int作为其底层实现。
如果我们在声明时候指定其底层实现,则不限作用域的枚举类型也可以前置声明,例如: