带有char数组的C ++ struct以不寻常的方式初始化为零

时间:2018-04-24 03:00:26

标签: c++ initialization aggregate-initialization

遇到了一个非常见的c ++初始化代码,它似乎可以正常使用以下内容......

struct sfoobar { char bar[10]; char foo[10]; };
...
sfoobar x { 0 };

这是将这些char数组初始化为零的可接受方法吗?

1 个答案:

答案 0 :(得分:8)

这在C ++中有效。效果sfoobar x { 0 };会将x.barx.foo的所有元素初始化为0

根据aggregate initialization的规则,可以省略嵌套初始化列表的大括号,

  

嵌套初始化程序列表周围的大括号可以省略(省略),在这种情况下,必要时使用许多初始化子句来初始化相应子集合的每个成员或元素,后续的初始化子句用于初始化以下内容对象的成员。

然后sfoobar x { 0 };表示将x.bar的第一个元素初始化为0

  

如果初始化程序子句的数量少于成员数and bases (since C++17)或初始化程序列表完全为空,则其余成员and bases (since C++17)将按空列表初始化by their default initializers, if provided in the class definition, and otherwise (since C++14),具体如下:通常的列表初始化规则(使用默认构造函数对非类类型和非聚合类执行值初始化,以及聚合的聚合初始化)。

所有剩余的元素,包括x.bar的第2到第10个元素以及x.foo的所有元素,也会被初始化为0