首先第一点,我们要弄清一个概念,那就是枚举类型的名字都在其父作用域空间 可见的。举个例子就一目了然了。
enum Type { General, Light, Medium, Heavy };
enum Category{ General, Pistol, MachineGun, Cannon };
由于Category中的General和Type中的General都是全局的名字,因此编译器会报错。
C++11之前的程序员为了解决这个问题,通过namespace来分割全局空间,但是,同理,在新的那个命名空间中,仍然存在着被enum成员污染的问题。
第二点,还有一个长期让程序员不舒服的问题,那就是对于枚举类型,我们通常使用的变量个数都不超过255个,也就是说用一个字节存储就足够了。但是,枚举变量却是按整形来存储的。我们多么希望可以指定存储类型,对于小于255的enum变量,要是可以指定用char来存储就好了。
当然,还有其他一些弊端,就不一一说了。之所以说以上两点,是为了引出今天的主人公——强类型枚举。
声明强类型枚举很简单,只需要在原有的enum后加上关键字class即可。
enum class Type { General, Light, Medium, Heavy };
这样,就声明了一个强类型枚举。强类型枚举有以下几点优势:
- 强作用域,强类型枚举成员的名称不会被输出到其父作用域空间。
- 转换限制,强类型枚举成员的值不可以与整型隐式地相互转换。
- 可以指定底层存储类型,强类型枚举默认的底层类型为int,但也可以显式地指定底层存储类型,具体的做法就是在枚举名称后面加上冒号和类型,该类型可以是除wchar_t之外的任何整形类型。比如 enum class Type : char { General, Light, Medium, Heavy };