Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
全局范围内变量和函数的递归依赖 我正在玩我的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"; }_C++_Initialization_Language Lawyer - Fatal编程技术网

全局范围内变量和函数的递归依赖 我正在玩我的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"; }

全局范围内变量和函数的递归依赖 我正在玩我的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"; },c++,initialization,language-lawyer,C++,Initialization,Language Lawyer,因此,当我使用declare这个t函数时,它依赖于foo函数,这个函数同样依赖于t。C++编译器通过在赋值表达式运行之前基本上有 t>代码> 0来初始化这个循环。 这让我很惊讶。根据标准,这是正确的行为还是我在这里调用了一些未定义的行为?,对象的生命周期被认为是在初始化完成时开始的;在此之前,访问它会导致UB : 。。。类型为T的对象的生存期始于: 获得类型T的正确对齐和尺寸的存储,以及 其初始化(如果有)已完成(包括真空初始化) 在C++20之前,这是一种定义良好的行为。首先执行的是 如中

因此,当我使用declare这个
t
函数时,它依赖于
foo
函数,这个函数同样依赖于
t
。C++编译器通过在赋值表达式运行之前基本上有<代码> t>代码> 0来初始化这个循环。 这让我很惊讶。根据标准,这是正确的行为还是我在这里调用了一些未定义的行为?

,对象的生命周期被认为是在初始化完成时开始的;在此之前,访问它会导致UB

:

。。。类型为
T
的对象的生存期始于:

  • 获得类型
    T
    的正确对齐和尺寸的存储,以及
  • 其初始化(如果有)已完成(包括真空初始化)
在C++20之前,这是一种定义良好的行为。首先执行的是

如中所述,在进行任何其他初始化之前,非常量初始化的静态变量和线程局部变量
(自C++14以来)
都是零初始化的。如果非类非局部变量的定义没有初始值设定项,则默认初始化不执行任何操作,而不修改早期零初始化的结果

从标准上看,

如果未执行常量初始化,则具有静态存储持续时间()或线程存储持续时间()的变量初始化为零()。零初始化和常量初始化统称为静态初始化;所有其他初始化都是动态初始化。所有静态初始化都强烈地发生在()任何动态初始化之前


@语言律师我不太确定,但这是否意味着
t
的生命周期只有在所有初始化(包括本例中的零初始化和复制初始化)完成时才开始?目前它的意思是在动态初始化完成之前访问对象是UB,但IIUC这被认为是一个缺陷。
Hello before main: 0
Hello from main.