c++ - 为什么 c++ 编译器接受这个初始化?静态整数 x = x;

标签 c++ static initialization

我刚知道这个:

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/

相关文章:

c++ - 施工期间初始化?

c++ - 在基类中使用派生类,而派生类在基类之后声明

c++ - 术语 "Most vexing parse"是何时何地创造的?

opencv - Cmake 没有将 opencv 库链接到创建的静态库

具有静态数组值对的 Java 类

java - Java中如何为继承字段赋值?

c++ - 减少我的 boost lib 文件夹

c++ - 我的函数操作 std::string 产生了意想不到的结果

java - 其中私有(private)和静态方法的行为与仅私有(private)方法不同

Java:为什么接口(interface)中的声明不够?