我看到了一些看起来像这样的旧代码:char foo[100] = { 0 };
。类似于结构的东西,如:STRUCT st = { 0 };
。两种情况下的意图都很清楚,即对相应变量进行零初始化。因此,char foo[100] {};
和STRUCT st {};
会更加惯用。
我的问题是:<variable> = { 0 }
的代码是否应该达到相同的结果?我已经使用发布 - 构建二进制文件对此进行了测试,并且这些元素似乎是零初始化的,但这是否由标准保证?在我看来,<variable> = { 0 }
应该只保证变量的第一个元素(数组元素或结构成员)为零。
此外,类似声明char foo[100] = {};
和STRUCT st = {}
表示什么行为?
(这个问题背后的动机是我将所有声明更改为惯用形式,但如果无法保证零初始化,则问题更严重,值得开票。)< / p>
答案 0 :(得分:2)
在我看来,
<variable> = { 0 }
应该只保证变量的第一个元素(数组元素或结构成员)为零。
对于POD类型,该语法与<variable> = {};
未明确指定的任何内容都初始化为零。仅当<variable> = { somve_value }
不为零时,some_value
的使用才会有所不同。
即使相同的语法可用于非POD类型,非POD类型的未明确初始化的元素也会使用其默认构造函数进行初始化。
如果列表中的initializer-clause少于聚合中的成员,则未显式初始化的每个成员都应从空的初始化列表([dcl.init.list])初始化。 [示例:
struct S { int a; const char* b; int c; }; S ss = { 1, "asdf" };
使用
ss.a
初始化1
,使用ss.b
初始化"asdf"
,使用ss.c
形式的表达式值初始化int()
,是,0
。 - 结束示例]