std::array是否保证对其所有元素执行零初始化?
std::array 初始化规则及示例代码行为说明
核心结论
你给出的代码中,Bar 类的 foo 成员是否会全部零初始化,完全取决于 Bar 对象的实例化方式,不存在统一的肯定/否定答案。
不同初始化场景的具体表现
- 默认初始化场景:写法为
Bar b;
该场景下不会做零初始化:编译器为 Bar 生成的默认构造函数会默认初始化 foo 成员,而 std::array 是聚合类型,默认初始化时如果元素是 Foo 这类 POD 类型,所有成员都会是不确定的垃圾值,访问未初始化的成员属于未定义行为。 - 值初始化场景:写法为
Bar b{};或Bar b = Bar();
该场景下所有字段都会被零初始化:值初始化会触发 Bar 对象整体先做零初始化,std::array 包裹的 2 个 Foo 元素的所有成员(包括普通成员 a、b,以及位域 c、d)都会被赋值为 0。
规则补充
std::array 本质是封装了原生数组的聚合类型,没有自定义构造函数,它的初始化规则和同类型的原生数组完全一致:
std::array<Foo, 2> arr;等价于Foo arr[2];std::array<Foo, 2> arr{};等价于Foo arr[2]{};
内容的提问来源于stack exchange,提问作者ImJa
相关产品推荐
相关产品推荐

