我不了解关于为其成员具有默认值的结构零初始化的情况。
如果我有这些结构:
struct A {
int *a;
int b;
};
struct B {
int *a;
int b;
B() : b(3) {}
};
struct C {
int *a;
int b = 3;
};
我们可以毫无疑问地说:
A a;
保留所有字段未初始化A a{};
是{nullptr,0}B b;
和B b{};
两者都是{垃圾,3}(该构造函数被调用)现在不清楚执行以下操作会发生什么,这是使用gcc的结果:
C c; // {garbage, 3}
C c{}; // {nullptr, 3}
问题是:如果我像这样显式构造对象,是否C c{};
保证将C::a
初始化为nullptr
,换句话说,是否具有默认成员(如C
零)会初始化其他成员C c{};
?
因为如果我的构造函数执行的操作与C
(如中的B
)相同,这不会发生,所以其他成员没有初始化为零,但是为什么呢?B
和之间有什么区别C
?
从C ++ 14开始,C
是聚合(如A
),C c{}
语法执行聚合初始化。其中部分包括:
[dcl.init.aggr] / 8如果列表中的初始化程序子句少于非联盟聚合中的元素,则按以下方式初始化每个未显式初始化的元素:
(8.1)—如果该元素具有一个默认成员初始化程序(12.2),则从该初始化程序初始化该元素。
(8.2)—否则,如果该元素不是引用,则从一个空的初始化程序列表(11.6.4)复制该元素。
(8.3)—否则,程序格式错误。
所以C c{};
等于C c{{}, 3};
。int*
用空列表初始化成员会使其初始化为零。
在C ++ 11中,C
它不是一个聚合(具有默认的成员初始化程序是不合格的),并且会C c{};
调用一个隐式定义的构造函数,使c.a
成员保持未初始化状态。
在标准的所有版本中,B
由于用户定义的构造函数,它都不是合计的。B b{};
调用该构造函数,该构造函数显式初始化b
成员并选择保留a
未初始化状态。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句