2

我见过一些看起来像这样的旧代码:char foo[100] = { 0 };. 结构也会发生类似的事情,例如:STRUCT st = { 0 };. 这两种情况的意图都很明确,即对各自的变量进行零初始化。因此,char foo[100] {};并且STRUCT st {};会更惯用。

我的问题是:应该<variable> = { 0 }期望代码达到相同的结果吗?我已经使用发布构建二进制文件对此进行了测试,并且元素似乎是零初始化的,但这是否由标准保证?在我看来,<variable> = { 0 }应该只保证变量的第一个元素(数组元素或结构成员)为零。

char foo[100] = {};此外,类似的声明和指示的行为是什么STRUCT st = {}

(这个问题背后的动机是我会将所有声明更改为惯用形式,但如果不能保证零初始化,那么问题会更严重,值得一试。)

4

1 回答 1

2

在我看来,<variable> = { 0 }应该只保证变量的第一个元素(数组元素或结构成员)为零。

对于 POD 类型,该语法与<variable> = {};

未明确指定的任何内容都将初始化为零。<variable> = { somve_value }仅当some_value不是零时,使用 of才会产生影响。

即使相同的语法可用于非 POD 类型,但未显式初始化的非 POD 类型的元素将使用其默认构造函数进行初始化。

8.5.1 聚合/7开始:

如果列表中的初始化子句少于聚合中的成员数,则每个未显式初始化的成员都应从空的初始化器列表([dcl.init.list])中初始化。[示例:

struct S { int a; const char* b; int c; };
S ss = { 1, "asdf" };

ss.a使用、 和形式的表达式的值进行初始化1,即. —结束示例]ss.b"asdf"ss.cint()0

于 2018-03-27T06:14:51.323 回答