C数组和结构中的C ++统一初始化

时间:2018-03-27 06:05:41

标签: c++ c++11 uniform-initialization

我看到了一些看起来像这样的旧代码:char foo[100] = { 0 };。类似于结构的东西,如:STRUCT st = { 0 };。两种情况下的意图都很清楚,即对相应变量进行零初始化。因此,char foo[100] {};STRUCT st {};会更加惯用。

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

此外,类似声明char foo[100] = {};STRUCT st = {}表示什么行为?

(这个问题背后的动机是我将所有声明更改为惯用形式,但如果无法保证零初始化,则问题更严重,值得开票。)< / p>

1 个答案:

答案 0 :(得分:2)

  

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

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

相同

未明确指定的任何内容都初始化为零。仅当<variable> = { somve_value }不为零时,some_value的使用才会有所不同。

即使相同的语法可用于非POD类型,非POD类型的未明确初始化的元素也会使用其默认构造函数进行初始化。

来自8.5.1 Aggregates/7

  

如果列表中的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。 - 结束示例]