非静态数据成员初始化 根据C++标准,以下三种结构定义有什么不同? struct Foo { int a; }; struct Foo { int a{}; }; struct Foo { int a{0}; };

非静态数据成员初始化 根据C++标准,以下三种结构定义有什么不同? struct Foo { int a; }; struct Foo { int a{}; }; struct Foo { int a{0}; };,c++,c++11,C++,C++11,最后两个是C++11 struct Foo { int a; }bar; 如果不在全局范围内或不是静态的,则bar.a未初始化 struct Foo { int a{}; }bar; 条形图a被初始化为0 struct Foo { int a{0}; }bar; 条形图a被初始化为0 struct Foo { int a{0}; }bar; 所以构造2和构造3是相同的。1是不同的 有关详细信息,您可能需要阅读第一个定义,如果您创建具有自动存储持续时间的Fo

最后两个是C++11

struct Foo
{
    int a;
}bar;
如果不在全局范围内或不是静态的,则bar.a未初始化

struct Foo
{
    int a{};
}bar;
条形图a被初始化为
0

struct Foo
{
    int a{0};
}bar;
条形图a被初始化为
0

struct Foo
{
    int a{0};
}bar;
所以构造2和构造3是相同的。1是不同的


有关详细信息,您可能需要阅读第一个定义,如果您创建具有自动存储持续时间的
Foo
实例,
a
将被取消初始化。您可以执行聚合初始化来初始化它

Foo f{0};  // a is initialized to 0
Foo
的第二和第三个定义都会将数据成员
a
初始化为
0


在C++11中,2和3都不是,而是C++14,因此尽管添加了大括号或相等的初始值设定项,它们仍然是聚合的。

第一个是POD类型。成员
a
由0初始化。

2和3不相同,即使它们在这种情况下做相同的事情。@Nawaz谢谢。我同意你的看法,我也这么认为。我的观点是,在OP的例子中,空大括号列表和带有
0
的大括号列表将显示相同的可观察效果。仅供参考,在您的第一个链接中有一个大括号覆盖了该问题。@Shafik我没有看到您添加到该答案中,很高兴所有信息都位于同一位置。我想,这是一个长的向下滚动。我只注意到需要添加,因为R.Martinho Fernandes添加了一个悬赏,寻找C++14的答案。@Praetorian:类似的问题,但不是非静态成员变量,如果我为第一个结构创建对象,如-Foo Foo{},则“int a”将初始化为0。为什么?@PabitraPadhy是的,
a
将为0,因为它的值已初始化。看见