[英]C++ uniform initialization in C arrays and structs
我看过一些看起来像这样的旧代码: char foo[100] = { 0 };
。 结构STRUCT st = { 0 };
发生类似的情况,例如: STRUCT st = { 0 };
。 在两种情况下,其意图都是明确的,即对各个变量进行零初始化。 因此, char foo[100] {};
和STRUCT st {};
会更加惯用。
我的问题是:应该期望具有<variable> = { 0 }
的代码实现相同的结果吗? 我已经使用release-build二进制文件对此进行了测试,并且元素似乎是零初始化的,但是标准可以保证吗? 在我看来, <variable> = { 0 }
仅应保证变量的第一个元素(数组元素或struct成员)为零。
另外,类似的声明char foo[100] = {};
指示了什么行为char foo[100] = {};
和STRUCT st = {}
?
(此问题的动机是我将所有声明都更改为惯用格式,但如果不能保证零初始化,那么问题就更严重了,值得重新审视。)
在我看来,
<variable> = { 0 }
仅应保证变量的第一个元素(数组元素或struct成员)为零。
对于POD类型,该语法与<variable> = {};
任何未明确指定的内容都将初始化为零。 仅当some_value
不为零时,使用<variable> = { somve_value }
才some_value
。
即使非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.c
与以下形式的表达式的值int()
即,0
。 — 结束示例 ]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.