我刚知道这个:
static int x = x;
为什么 C++ 编译器接受这个初始化?
我会称之为编译器异常,但有人可能会对此给出一个很好的解释。
因此,对于具有静态存储的数据,可以使用自身初始化变量...我已经使用 VS2015 和 VS2017 编译器以及其他一些在线 C++ 编译器进行了尝试。
最佳答案
static
和非static
变量其实是一样的。
名称在其声明符 之后和初始化之前(如果有的话)立即变得可见。因此在
static int x = x;
名称 x
在第一次出现后立即可见,并且可以在初始化程序中引用。因为它是静态的,所以它的初始值是明确定义的(它是 0
)。
这也是合法的,即使在 block 范围内也是如此:
int x = x;
虽然在这里您可能会收到警告,因为 x
正在使用其自己的不确定值进行初始化(在大多数情况下行为未定义)。
这是一件愚蠢的事情,但 C++ 并没有竭尽全力阻止您做愚蠢的事情。例如,您可能想要声明一个指向自身的指针:
void *p = (void*)&p;
这里的初始化程序指的是 p
的地址而不是它的值,但是名称 p
必须是可见的才能使其工作。认为不值得添加特殊情况规则。
关于c++ - 为什么 c++ 编译器接受这个初始化?静态整数 x = x;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56743024/