现代C++强类型枚举定义中,class关键字是否可选?
C++强类型枚举的class关键字与指定底层类型的枚举解析
好问题!咱们把这个问题拆成几个关键点来解释清楚:
1. 强类型枚举的class/struct关键字是必须的
在C++11及以后的标准中,强类型枚举(也就是大家常说的enum class或enum struct)必须显式写出class或struct关键字,没有“隐式存在”的说法。这是语法上的硬性要求——强类型枚举的核心特性,比如成员名称的作用域隔离、禁止隐式转换为整数类型,都是通过class/struct标识来触发的。如果省略这个关键字,它就不再是强类型枚举了。
2. enum SomeEnum: unsigned int { ... }是独立的语法特性
你看到的这段代码,是C++11新增的无作用域枚举指定底层类型的语法,和强类型枚举是完全不同的东西:
- 它本质上还是传统的无作用域枚举,成员会暴露在当前作用域中,并且可以隐式转换为整数类型;
- 它只是解决了C++03中传统枚举底层类型由编译器自行决定的问题,允许开发者显式指定枚举的底层整数类型(比如这里的
unsigned int)。
3. VS2015(MSVC 19)的表现完全符合标准
这并不是编译器的疏漏,VS2015的行为严格遵循C++11规范:这段代码本来就是无作用域枚举指定底层类型的写法,和强类型枚举没有关系,自然不需要class关键字。
总结一下
- 强类型枚举必须显式使用
enum class/enum struct,class绝对不能省略; - 指定底层类型的无作用域枚举是另一种独立语法,和强类型枚举的特性完全无关;
- 不存在“强类型枚举时class关键字隐式存在”的情况。
内容的提问来源于stack exchange,提问作者vlad_tepesch
相关产品推荐
相关产品推荐

