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

为何Clang不允许通过实例访问嵌套的enum class?

GCC vs Clang: 限定作用域枚举的成员访问差异问题

碰到过这种跨编译器的枚举访问坑吗?咱们先看这段测试代码:

struct S {
    enum class EnumClass { one } ;
    enum Enum { one };
};
int main() {
    S s;
    S::EnumClass e = s.EnumClass::one; // <- 在Clang中无法编译
    S::Enum e11 = s.Enum::one;
    S::Enum e12 = s.one;
}

问题现象

这段代码在GCC中可以正常编译运行,但在Clang 3.8和3.9版本里,编译标记的那一行时会抛出错误:

'S::EnumClass::one' is not a member of class 'S'

关键差异点

注意看枚举的类型:

  • 对于非限定作用域枚举Enum,不管是用s.Enum::one还是直接s.one访问成员,两个编译器都能正常处理;
  • 但对于限定作用域枚举EnumClass,通过对象s来访问其枚举成员的写法s.EnumClass::one,在旧版Clang里就会报错——这明显是Clang早期版本的一个兼容性bug。

内容的提问来源于stack exchange,提问作者danpla

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:26:23