从全局变量初始化静态成员时“无效使用非静态数据成员”

YuC*_*Lan 19 c++ static-members member-initialization

class A {
    int x;
    static int i;
};


int x = 10;
int A::i = x;
Run Code Online (Sandbox Code Playgroud)

当我编译上面的代码时,出现错误

<source>:8:12: error: invalid use of non-static data member 'A::x'
    8 | int A::i = x;
      |            ^
<source>:2:9: note: declared here
    2 |     int x;
      |         ^
Run Code Online (Sandbox Code Playgroud)

是什么导致了这个错误?

mol*_*ilo 21

这是一个特殊的语言怪癖 - 左侧的范围解析, in int A::i,影响右侧的查找范围,因此实际上指的是x的成员A

重命名变量之一,或x显式指定所需的范围:

int A::i = ::x;
Run Code Online (Sandbox Code Playgroud)

  • 我不会称这是一种特殊的语言怪癖。想象一下,如果“A::i”是一个被定义的函数,而不是一个静态数据成员。您可能会期望,在函数体内,“x”将引用“A::x”。只是当同样的事情发生在静态数据成员定义中时,会有点令人惊讶,因为我们不习惯。 (3认同)