C++17中使用空大括号{}初始化非静态POD类成员是否会被初始化为0?
C++17中使用空大括号{}初始化非静态POD类成员是否会被初始化为0?
嗨,我来给你把这个问题讲得明明白白——在C++17标准下,你代码里用空大括号{}初始化的非静态POD类成员,确实会被初始化为对应类型的零值,也就是你说的int是0,double是0.0,完全符合你的经验观察。
先看你的代码例子:
class A { int a_{}; // 确实会初始化为0 double b_{}; // 确实会初始化为0.0 // etc. };
这里的a_{}和b_{}属于值初始化的范畴。根据C++17标准的规定,当用空的初始化器{}来初始化一个POD类型的对象时,会触发值初始化;而对于算术类型(比如int、double这类),值初始化的效果就是零初始化——直接把变量设置为该类型的零值。
你之前疑惑为什么看的链接没明确说明,其实核心点在于:空大括号初始化的行为在C++11之后就已经明确了,对于POD类型来说,值初始化等价于零初始化。而编译器警告你要初始化成员,恰恰是因为如果不加{},编译器生成的默认构造函数对非静态POD成员只会做默认初始化,这时候成员的值是未定义的(可能是随机垃圾值),但加了{}就强制触发了值初始化,彻底解决了未初始化的问题。
总结一下:
- 空大括号
{}初始化非静态POD成员 → 触发值初始化 - POD类型的算术成员值初始化 → 零初始化(即0、0.0等)
- 你的写法完全符合需求,也有明确的标准依据支撑
备注:内容来源于stack exchange,提问作者PaulH
相关产品推荐
相关产品推荐

