我在使用C++编译器进行编程时,注意到一个全局变量和函数调用之间的递归依赖关系没有被拒绝。例如:
#include <iostream>
int foo();
int t = foo();
int foo()
{
std::cout << "Hello before main: " << t << "\n";
t = 10;
return t + 10;
}
int main()
{
std::cout << "Hello from main.\n";
}
这个已编译的程序会输出以下内容:
Hello before main: 0
Hello from main.
当我声明变量 t
时,它依赖于函数 foo
,而函数 foo
又依赖于变量 t
。C++ 编译器通过将 t
在赋值表达式运行之前初始化为零来打破这个循环。
这让我感到惊讶。这是根据标准的正确行为,还是我在这里调用了一些未定义的行为?
t
的生命周期仅在所有初始化(包括此情况下的零初始化和复制初始化)完成后才开始? - songyuanyao