静态变量与其自身的初始化
Initialisation of static variable with itself
考虑以下代码示例:
#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
的定义之前,它就已经对其进行了零初始化
正如标准中进一步规定的那样,静态变量初始化应分为两个阶段(强调挖掘)。
零初始化和常量初始化统称为静态初始化;所有其他初始化是动态初始化应在进行任何动态初始化之前执行静态初始化。
相关文章:
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 在 C++ 中访问 lambda 捕获初始化变量
- 为什么C++不支持对未初始化变量进行智能分析?
- 使用 clang++ 和 g++ 在C++中初始化变量
- C++使用 lambda 初始化变量
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++ - 输出与初始化变量不同?
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 在C++中,为什么int可以使用new运算符初始化变量,而double不能
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- C++ 中的初始化变量
- C++中未初始化变量的值
- 如何在需要提及需要循环声明的其他类的类中初始化变量?
- 我想知道在构造函数中初始化变量时的生命周期
- 读取恰好具有良好值的未初始化变量
- 如何在 getter 的父类中初始化变量的情况下访问子类中的变量
- 为什么在 c++ 中有多种初始化变量的方法
- 没有参数的默认构造函数是否总是初始化变量?
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- 使用构造函数跳闸UB的新放置后使用初始化变量