下列陈述正确吗?
它们基于[dcl.init.general/6] (粗体强调地雷):
要将对象或
T类型的引用初始化为零,意味着:
T是标量类型,则将对象初始化为通过将整数字面0 (0)转换为T获得的值;T是(可能是cv限定的)非并类类型,则其填充位被初始化为零位和每个非静态数据成员,每个非虚拟基类子对象,如果对象不是基类子对象,则每个虚拟基类子对象都为零初始化;T是(可能是cv限定的)联合类型,则其填充位被初始化为零位,并且对象的第一个非静态命名数据成员为零初始化;T是数组类型,则每个元素都为零初始化;T是引用类型,则不执行初始化。在[dcl.init.general/7] (粗体强调地雷)上:
默认情况下-初始化
T类型的对象意味着:
T是(可能是cv限定的)类类型(类),则考虑构造函数。列举了适用的构造函数(over.match.ctor),并通过过载解析(over.match)选择了初始化器()的最佳构造函数。使用空参数列表调用所选择的构造函数来初始化对象。T是数组类型,则每个元素都是默认初始化的。发布于 2021-09-16 10:14:55
下列陈述正确吗?
不,你在翻转他们头上的逻辑连接。
“零初始化”和“默认初始化”的定义指定了如果标准中的其他内容表示“对象为零初始化”,则它意味着什么。当标准这么说的时候,你可以用零初始化的定义来了解它的含义。作为参考,它意味着不进行初始化。因此,零初始化引用未初始化(因此格式不正确)。
不过,这并不意味着情况会相反。未初始化的引用不是零初始化的。这是一个谬论:顺向
当标准规定执行零初始化时,引用被初始化为零。
发布于 2021-09-16 10:08:21
(同一问题中的几个问题:我将回答一个问题)
下面的陈述正确吗?
不是的。不存在未初始化的引用,因为它需要引用变量或对象,而不是(引用类型)参数或(引用类型)返回类型,其中不应用上下文初始化;根据[dcl.init.ref]/1和/3
/1声明类型为“引用T”(dcl.ref) 的变量将被初始化。 /3 --仅在参数声明(dcl.fct)、函数返回类型的声明、类定义(class.mem)中的类成员声明以及显式使用extern说明符的情况下,才能省略作为引用的初始化器。
关于引用的[dcl.init.general]/6
要将对象或T类型的引用初始化为零,意味着:
它指的是该标准的其他部分适用于零初始化的情况(以及它对不同实体的影响);对于引用的初始化,特别是考虑静态初始化,按照[basic.start.static]/2的要求进行。
..。如果不执行常量初始化,则具有静态存储持续时间 (basic.stc.static)或线程存储持续时间(basic.stc.thread) 的变量为零初始化 (dcl.init)。零初始化和常量初始化共同称为静态初始化,所有其他初始化都是动态初始化,所有静态初始化在任何动态初始化(intro.races)之前都会强烈发生。
这样,引用类型变量的静态初始化(不是常量初始化)将完全属于动态初始化,因为静态初始化的第一步零初始化的效果不是初始化。
发布于 2021-09-16 10:14:46
未初始化的引用被视为零初始化.
如果未初始化的引用是零初始化的,则可能是这样。也就是说,未初始化的引用已经被零初始化和未初始化的引用还没有零初始化之间没有明显的区别。
未初始化的标量被视为默认初始化。
如果未初始化的标量是默认的-初始化的话,情况可能是这样。尽管如此,一个未初始化的标量已经默认初始化,而一个未初始化的标量尚未默认初始化,两者之间没有明显的区别。
任何其他未初始化的实体都不被视为零初始化或默认初始化。
实体在被零初始化之后被认为是零初始化,在默认初始化之后被认为是默认初始化。
https://stackoverflow.com/questions/69206296
复制相似问题