当前的标准草案说(以前的标准有类似的措辞)[基本生活/1] http://www.eel.is/c++draft/basic.life#1:
对象或引用的生命周期是该对象或引用的运行时属性。据说一个物体有非空的如果它是类或聚合类型,并且它或其子对象之一是由普通默认构造函数以外的构造函数初始化的,则初始化。 [ 注意:通过简单的复制/移动构造函数进行初始化是非空的初始化。 —《尾注》] T 类型对象的生命周期从以下时刻开始:
(1.1) 获得类型 T 具有适当对齐和大小的存储,并且
(1.2) 如果物体有非空的初始化,其初始化完成
为什么初始化在这里很重要非空的?换句话说,如果初始化没有完成,为什么生命周期在初始化完成之前就开始了?非空的?它解决什么问题?
如果将(1.2)理解为,会产生什么后果
(1.2) 如果对象有初始化,则其初始化完成
期限非空的只用在这里,肯定有什么原因。
注意,我之前也有过类似的问题here https://stackoverflow.com/questions/52154744/lifetime-of-object-which-has-vacuous-initialization,但由于这个问题有点太宽泛(甚至我接受了其中一个答案),那里的回答并没有回答这个当前的问题。
我认为它是为了解决不执行初始化的默认初始化:
[dlc.init]:
默认初始化 T 类型的对象意味着:
(7.1) — 如果 T 是一个(可能是 cv 限定的)类类型(第 12 条),则考虑构造函数。枚举了适用的构造函数(16.3.1.3),并通过重载决议(16.3)选择最适合初始化器()的构造函数。使用空参数列表调用如此选择的构造函数来初始化对象。
(7.2) — 如果 T 是数组类型,则每个元素都默认初始化。
(7.3) — 否则,不执行初始化。
我知道所有对象都有初始化,但对于某些具有默认初始化的对象,不执行初始化。请注意,它特别指出“未执行初始化”,并不是说它不存在。
您可以拥有一个默认初始化的对象,但未执行任何初始化,因此它无法完成。他们不会开始他们的一生,按照目前的措辞,他们不必等待这种“不初始化”的发生来开始他们的生活。此外,此类对象必须进行初始化,因为它是默认初始化的。
恕我直言,您的措辞会有缺陷,或者您的理解会导致默认初始化定义 7.3 的逻辑后果,因为此类对象将:
- 已经初始化并且不会开始生存,因为它没有执行。
- 默认初始化,但不会进行初始化。我知道这可能会令人困惑。
从目前的措辞来看,已经很清楚了。也许某个地方可以明确说明哪些对象具有初始化或者初始化意味着什么。我想都可以,但我手下没有它的草图。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)