在main函数内将enum class重定义为普通enum是否属于合规行为?
结论
你观察到的两段代码的编译差异是C++标准规定的预期行为,核心由单一定义规则(ODR)和作用域遮蔽规则共同决定。
第二段代码编译失败的原因
全局作用域属于同一个声明域,C++标准要求同一个作用域内不允许重复定义同名的类型实体:
- 你先在全局作用域定义了
enum class Anything - 之后又在同一个全局作用域定义同名的普通
enum Anything
两种枚举虽然类型不同,但名字完全一致,属于同作用域下的重复定义,违反单一定义规则,编译器直接报错是符合规范的。
第一段代码编译成功的原因
函数体属于独立的内层局部作用域,C++标准允许内层作用域声明和外层作用域同名的实体,此时内层的同名实体会遮蔽外层的实体,不属于重定义:
- 全局作用域的
enum class Anything是外层实体 - main函数内部定义的普通
enum Anything是内层局部作用域的独立实体,两者属于不同作用域,不存在冲突
此时在main函数内直接使用Anything默认指向局部定义的普通枚举,如果需要访问全局的作用域枚举,可以使用全局作用域限定符::Anything调用。
内容的提问来源于stack exchange,提问作者Jonh Smith Benjamin
相关产品推荐
相关产品推荐

