C++11中类std::array成员用{}是否会初始化所有数组元素?
问题解答
问题1:var2_{}是否能保证所有数组元素零初始化
答案是可以,符合C++11及之后标准的明确规定:
std::array属于聚合类型,空大括号触发聚合初始化规则- 聚合初始化时如果初始化列表的元素数量少于聚合的成员数量,剩余所有成员都会执行值初始化
- 对于
std::uint8_t这种算术基础类型,值初始化等价于零初始化,因此100个元素都会被初始化为0
问题2:C++11下是否可以在成员定义行初始化为非0值
答案是可以,有两种常用实现方案:
方案1:直接写聚合初始化列表
如果只需要给前N个元素设置非0值,剩余元素自动零初始化,直接在大括号内罗列初始值即可:
class X { private: std::size_t var1_{0}; // 前3个元素设为1、2、3,剩余97个元素自动零初始化 std::array<std::uint8_t, 100> var2_{1, 2, 3}; };
方案2:立即调用Lambda实现全元素统一赋值
如果需要把所有元素设为同一个非0值,可以在初始化器中使用立即调用的Lambda表达式,不需要修改构造函数代码:
class X { private: std::size_t var1_{0}; // 所有元素初始化为0xAA std::array<std::uint8_t, 100> var2_{ []{ std::array<std::uint8_t, 100> arr{}; for (auto& elem : arr) { elem = 0xAA; } return arr; }() }; };
注意:C++11对constexpr函数的限制较严格,无法在constexpr函数内使用循环实现数组填充,上述Lambda方案是运行期初始化,性能影响可以忽略,符合绝大多数场景的需求。
内容的提问来源于stack exchange,提问作者astrophobia
相关产品推荐
相关产品推荐

