You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

未初始化引用是zero-initialized吗?未初始化标量是default-initialized吗?

C++初始化规则正误判断

三个表述的判断结果

  • 「未初始化的引用属于zero-initialized」:❌ 错误
  • 「未初始化的标量属于default-initialized」:❌ 错误
  • 「其余任何未初始化实体既不属于zero-initialized,也不属于default-initialized」:✅ 正确

判断依据

以下规则来自C++标准[dcl.init.general/6]与[dcl.init.general/7]:

对类型T的对象或引用执行zero-initialize指:

  • 若T为标量类型,将对象初始化为整数字面量0转换为T后得到的值;
  • 若T为(可带cv限定符的)非联合体类类型,其填充位被初始化为零比特,每个非静态数据成员、每个非虚基类子对象,若该对象不是基类子对象,则每个虚基类子对象均执行zero-initialize;
  • 若T为(可带cv限定符的)联合体类型,其填充位被初始化为零比特,对象的首个非静态具名数据成员执行zero-initialize;
  • 若T为数组类型,每个元素均执行zero-initialize;
  • 若T为引用类型,不执行任何初始化。

对类型T的对象执行default-initialize指:

  • 若T为(可带cv限定符的)类类型([class]),则考虑构造函数,枚举适用构造函数([over.match.ctor]),通过重载决议([over.match])选择最适配空初始化器()的构造函数,调用选中的构造函数并传入空参数列表完成对象初始化;
  • 若T为数组类型,每个元素均执行default-initialize;
  • 其他情况,不执行任何初始化。

详细解释

  1. 针对引用的zero-initialize规则明确说明,对引用执行零初始化时不会做任何操作,不存在“未初始化的引用属于zero-initialized”的情况,且C++中引用本身要求必须绑定到合法实体,未绑定的引用本身属于未定义行为,更不属于任何初始化分类。
  2. 标量的default-initialize规则仅说明“对标量执行default-initialize时不做初始化”,反过来未初始化的标量可能来自多种场景,比如静态存储期的未初始化标量实际属于zero-initialized范畴,不能直接把所有未初始化标量都归为default-initialized,逻辑上不能倒推。
  3. 结合两个初始化规则的覆盖范围,除开以上提到的场景外,其余未初始化实体确实既不属于zero-initialized,也不属于default-initialized。

内容的提问来源于stack exchange,提问作者Géry Ogam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:09:02