【问题标题】:C++ uniform initialization in C arrays and structsC 数组和结构中的 C++ 统一初始化
【发布时间】:2018-03-27 06:05:41
【问题描述】:

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

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

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

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

【问题讨论】:

  • 什么是STRUCT
  • @juanchopanza:任何类型的 C 结构
  • 没有惯用的形式。= { 0 }是C中唯一允许的初始化形式,C++11允许空括号列表和统一初始化struct s {};注意有水下礁与它的使用,统一初始化可能不会像你所期望的那样接受initializer_list 的非平凡类。例如。 vector<int> v {3}; 创建包含一个值为 3 的元素的向量。
  • 另外,{ 0 } 的含义与你的理解略有不同。在旧的“C”规则下,这会将第一个成员初始化为给定的值,然后将任何其他成员归零。 IE。 { 1 } 不会将所有成员都设置为 1。

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


【解决方案1】:

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

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

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

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

来自8.5.1 Aggregates/7

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

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

1初始化ss.a,用"asdf"初始化ss.b,用int()形式的表达式的值初始化ss.c,即0。 — 结束示例 ]

【讨论】:

  • 值得指出的是,非 POD 类型的语法也是等价的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 2010-12-06
相关资源
最近更新 更多