为何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
相关产品推荐
相关产品推荐

