为什么c ++编译器接受这个初始化?static int x = x;

Sil*_*iu 10 c++ static initialization

我刚刚发现了这个,我称之为编译异常,但有人可能会对此有一个很好的解释.

因此,对于静态存储数据,可以用自己初始化变量......我已经尝试使用VS2015和VS2017编译器以及其他一些在线c ++编译器.

Kei*_*son 17

它实际上static和非static变量相同.

名称在其声明符之后和初始化之前立即可见(如果有).因此在

static int x = x;
Run Code Online (Sandbox Code Playgroud)

名称x在第一次出现后立即可见,并可在初始化程序中引用.因为它是静态的,所以它的初始值很明确(它是0).

即使在块范围内,这也是合法的:

int x = x;
Run Code Online (Sandbox Code Playgroud)

虽然在这里你可能会收到一个警告,因为x它正在使用自己的不确定值进行初始化(在大多数情况下,行为是未定义的).

这是一个愚蠢的事情,但C++并不是为了阻止你做愚蠢的事情.例如,您可能希望声明指向自身的指针:

void *p = (void*)&p;
Run Code Online (Sandbox Code Playgroud)

这里初始化程序引用的是地址p而不是它的值,但是名称p必须是可见的才能使其起作用.添加特殊情况规则被认为是不值得的.

  • `int x = x;`在块中的`是C++中的UB:对不确定值(除了unsigned char类型之外)的求值是立即UB,没有像C11 + DR451那样的不确定值的部分传播 (2认同)
  • @DanielH与`unsigned char x;`相同.见[basic.scope.pdecl] (2认同)
  • 无需***到`void *`,只需分配即可。 (2认同)