【发布时间】:2021-11-11 07:41:57
【问题描述】:
下列说法正确吗?
- 未初始化的引用被视为零初始化。
- 未初始化的标量被认为是默认初始化的。
- 任何其他未初始化的实体都不会被视为零初始化或默认初始化。
它们基于[dcl.init.general/6](我的粗体强调):
零初始化
T类型的对象或引用意味着:
- 如果
T是标量类型,则对象初始化为整型文字0(零)转换为T得到的值;- 如果
T是(可能是 cv 限定的)非联合类类型,则其填充位和每个非静态数据成员、每个非虚拟基类子对象初始化为零位,并且,如果对象不是基类子对象,每个虚拟基类子对象都是零初始化的;- 如果
T是(可能是 cv 限定的)联合类型,则其填充位初始化为零位,并且对象的第一个非静态命名数据成员初始化为零;- 如果
T是数组类型,每个元素都初始化为零;- 如果
T是引用类型,则不进行初始化。
[dcl.init.general/7](我的粗体强调):
默认初始化
T类型的对象意味着:
- 如果
T是(可能是cv 限定的)类类型([class]),则考虑构造函数。枚举适用的构造函数 ([over.match.ctor]),并通过重载决议 ([over.match]) 为 initializer()选择最佳构造函数。如此选择的构造函数被调用,并带有一个空参数列表,以初始化对象。- 如果
T是数组类型,则每个元素都是默认初始化的。- 否则,不执行初始化。
【问题讨论】:
-
出于好奇,您有未初始化引用的示例吗?我认为那是不可能的
-
@Jarod42 无法重新分配参考。
-
我还有一个问题:是否已经vacuously初始化了一个实体,完全初始化了吗?
-
@eerorika 并非所有默认初始化都是空的。非平凡类类型的默认初始化是非空的,它使用构造函数。 “被默认初始化”有特定的含义,明确定义,即使对于特定类型 T,如果它意味着“对象表示的字节未初始化”,那么它仍然是 默认初始化 .
-
我假设您的意思是 [dcl.constexpr] p10,不,空洞的初始化在那里是不够的(如示例所示的非规范性)。我认为措辞很差,但应该更准确。
标签: c++ initialization language-lawyer