静态变量与其自身的初始化

Initialisation of static variable with itself

本文关键字:初始化 变量 静态      更新时间:2023-10-16

考虑以下代码示例:

#include <iostream>
static int bar = bar;
int main()
{
    int foo = foo;
    std::cout << "foo = " << foo << std::endl;
    std::cout << "bar = " << bar << std::endl;
}

我收到以下编译器警告:

main.cpp: In function 'int main()':
main.cpp:7:15: warning: 'foo' is used uninitialized in this function [-Wuninitialized]
     int foo = foo;
               ^

输出:

foo = 0
bar = 0

我预料到了这个警告,因为foo是统一使用的。"foo"可以是任何值,而不是0。自我分配未定义。

但是,为什么"酒吧"的自我分配没有得到警告?这种"bar"的分配是定义的还是未定义的行为?为什么?

我知道,elementar数据类型的静态变量是用"0"初始化的,但在这种情况下,变量"bar"在初始化过程中使用。我想知道,这是否是定义的行为,而"0"是否是预期的输出。(这可以解释,没有编译器警告发生)。

链接到实时示例

我相信标准的一部分与您的问题(§3.6.2/2)相关:

静态存储持续时间为(3.7.1)或线程存储持续时间(3.7.2)的变量应初始化为零(8.5)在进行任何其他初始化之前。[…]

因此,在这种情况下,甚至在编译器查看您对bar的定义之前,它就已经对其进行了零初始化

正如标准中进一步规定的那样,静态变量初始化应分为两个阶段(强调挖掘)。

零初始化和常量初始化统称为静态初始化;所有其他初始化是动态初始化应在进行任何动态初始化之前执行静态初始化