默认初始化和值初始化的含义?

Meaning of default init and value init?

我对 C++ 初始化变量的方式感到很困惑。如果有的话,它们之间有什么区别:

int i; // does this make i uninitialized?
int i{}; // does this make i = 0?
std::array<int, 3> a; // is a all zeros or all uninitialized?
std::array<int, 3> a{}; // same as above?

感谢您的澄清

当您声明一个变量但未使用值对其进行初始化时,它是未初始化的(它包含以前存储在该地址中的数据)。它还取决于范围和其他因素来确定其初始值。 {} 像在 int i{}; 中一样使用调用其构造函数,默认情况下将内存初始化为其默认值。

所有数据结构都是一样的(除了构造函数被删除的那些)。

int i; // does this make i uninitialized?

是,如果在局部范围内而不是在全局范围内。

int i{}; // does this make i = 0?

是的,总是。

std::array<int, 3> a; // is a all zeros or all uninitialized?

如果在本地范围内未初始化,但在全局范围内清零,即与您的第一个问题相同。

std::array<int, 3> a{}; // same as above?

所有值都默认初始化,即所有三个元素都归零。

我想补充一下之前的回答, 当您像这样 {} 初始化变量时,它可以防止缩小类型。例如

int x = 4.5 // It will narrowed to 4
int y{4.5}  //it will not compile