为什么clang不允许通过实例访问嵌套的枚举类?

时间:2018-04-25 17:16:34

标签: c++ clang language-lawyer

请考虑以下代码:

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'

鉴于未编码的枚举工作正常,这似乎是一个错误。

1 个答案:

答案 0 :(得分:9)

这是gcc 1 中的错误。相关措辞在[expr.ref]p2

  

在任何一种情况下, id-expression [here:EnumClass::one]都应该命名该类或其某个基类的成员。

EnumClass::one不是指类的成员,它是枚举的成员。这个枚举是否属于类的一部分并不重要,只是成员one本身不属于该类。

Enum::one是班级的一部分吗?是的,根据[class.member]p1

  

类的成员是数据成员,成员函数,嵌套类型,枚举数以及成员模板和特化。

并在[class.member]p3中更加明确:

  

类中定义的无范围枚举的枚举器是类的成员。

1 :我甚至会把它称为标准中的一个错误,因为似乎没有任何(技术)理由为什么不允许这样做,我认为它允许它是个好主意。虽然有关于允许它的讨论,所以让我们看看委员会的决定。