未初始化的引用是否为零初始化,未初始化的标量是否默认初始化?

Mag*_*ero 2 c++ initialization language-lawyer

以下陈述是否正确?

  • 未初始化的引用被视为零初始化。
  • 未初始化的标量被视为默认初始化的。
  • 任何其他未初始化的实体不被视为零初始化或默认初始化。

它们基于[dcl.init.general/6](粗体强调我的):

对类型的对象或引用进行零初始化T意味着:

  • 如果是标量类型,则该对象被初始化为通过将整数文字(零)转换为;T获得的值。0T
  • 如果T是(可能是 cv 限定的)非联合类类型,则其填充位初始化为零位,并且每个非静态数据成员、每个非虚拟基类子对象,并且如果该对象不是基类子对象,每个虚拟基类子对象都是零初始化的;
  • 如果T是(可能是 cv 限定的)联合类型,则其填充位被初始化为零位,并且对象的第一个非静态命名数据成员被零初始化;
  • 如果T是数组类型,则每个元素都初始化为零;
  • 如果T是引用类型,则不执行初始化。

以及[dcl.init.general/7](粗体强调我的):

默认初始化类型的对象T意味着:

  • 如果T是(可能是 cv 限定的)类类型 ([class]),则考虑构造函数。枚举适用的构造函数 ([over.match.ctor]),并通过重载决策 ([over.match]) 选择最适合初始化器的构造函数。 ()使用空参数列表调用如此选择的构造函数来初始化对象。
  • 如果T是数组类型,则每个元素都默认初始化。
  • 否则,不执行初始化。

Jon*_*ely 8

以下陈述是否正确?

不,你是在颠覆他们的逻辑联系。

“零初始化”和“默认初始化”的定义指定了标准中其他内容表示“对象是零初始化”的含义。当标准这么说时,您可以使用零初始化的定义来了解它的含义。作为参考,这意味着没有完成初始化。因此零初始化的引用是未初始化的(因此格式错误)。

但这并不意味着相反。未初始化的引用不是零初始化的。这是一个谬误: https: //en.wikipedia.org/wiki/Affirming_the_consequent

当标准规定执行零初始化时,引用被零初始化。