遇到了一个非常见的c ++初始化代码,它似乎可以正常使用以下内容......
struct sfoobar { char bar[10]; char foo[10]; };
...
sfoobar x { 0 };
这是将这些char数组初始化为零的可接受方法吗?
答案 0 :(得分:8)
这在C ++中有效。效果sfoobar x { 0 };
会将x.bar
和x.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
。