类定义中的无范围枚举器

时间:2014-12-30 04:50:14

标签: c++ class enums nested

众所周知,静态数据成员不应在类定义中定义:

N4296:9.4.2/2 [class.static.data]

  

在其类定义中声明静态数据成员不是   定义,除了cv-qualified之外,可能是不完整的类型   无效。静态数据成员的定义应出现在   命名空间范围包含成员的类定义。

考虑以下课程:

#include <iostream>

struct A
{
    enum E { x = 2, y = 3 }; //both enuerators are defined in the definition of `A`
};

int x = A::x; //looks like A::x is static data member, despite being defined in the scope of `A`

int main(){ std::cout << x << std::endl; }

DEMO

在示例中,所有枚举器都在类范围内声明,实际上是:

N4296::7.2/11 [dcl.enum]

  

每个枚举名称和每个未作用域的枚举器都在作用域中声明   它立即包含枚举说明符。

因此,不清楚的是,未作用域的枚举数是静态或非静态数据成员。我们可以在object-expression之外使用它们,因此它们应该是静态的。另一方面,我们无法在类范围中定义静态数据成员。这对我来说有点矛盾,你不能澄清一下吗?

2 个答案:

答案 0 :(得分:3)

在您的示例中,A::x根本不是数据成员。它没有存储空间。要向自己证明这一点,请尝试使用其地址:您不能。

答案 1 :(得分:2)

[class.mem] / P1:

  

类的成员是数据成员,成员函数(9.3),嵌套   类型和枚举器。

调查员不是数据成员。