众所周知,静态数据成员不应在类定义中定义:
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; }
在示例中,所有枚举器都在类范围内声明,实际上是:
N4296::7.2/11 [dcl.enum]
每个枚举名称和每个未作用域的枚举器都在作用域中声明 它立即包含枚举说明符。
因此,不清楚的是,未作用域的枚举数是静态或非静态数据成员。我们可以在object-expression
之外使用它们,因此它们应该是静态的。另一方面,我们无法在类范围中定义静态数据成员。这对我来说有点矛盾,你不能澄清一下吗?
答案 0 :(得分:3)
在您的示例中,A::x
根本不是数据成员。它没有存储空间。要向自己证明这一点,请尝试使用其地址:您不能。
答案 1 :(得分:2)
[class.mem] / P1:
类的成员是数据成员,成员函数(9.3),嵌套 类型和枚举器。
调查员不是数据成员。