请考虑以下代码:
struct S {
enum class EnumClass {
one
} ;
enum Enum {
one
};
};
int main()
{
S s;
S::EnumClass e = s.EnumClass::one; // <- Doesn't compile with clang
S::Enum e11 = s.Enum::one;
S::Enum e12 = s.one;
}
一切都适用于GCC,但是clang(3.8和3.9都没有)编译s.EnumClass::one
,给出错误:'S::EnumClass::one' is not a member of class 'S'
。
鉴于未编码的枚举工作正常,这似乎是一个错误。
答案 0 :(得分:9)
这是gcc 1 中的错误。相关措辞在[expr.ref]p2:
在任何一种情况下, id-expression [here:
EnumClass::one
]都应该命名该类或其某个基类的成员。
EnumClass::one
不是指类的成员,它是枚举的成员。这个枚举是否属于类的一部分并不重要,只是成员one
本身不属于该类。
但Enum::one
是班级的一部分吗?是的,根据[class.member]p1:
类的成员是数据成员,成员函数,嵌套类型,枚举数以及成员模板和特化。
并在[class.member]p3中更加明确:
类中定义的无范围枚举的枚举器是类的成员。
1 :我甚至会把它称为标准中的一个错误,因为似乎没有任何(技术)理由为什么不允许这样做,我认为它允许它是个好主意。虽然有关于允许它的讨论,所以让我们看看委员会的决定。