You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 13:15:03