【发布时间】:2021-06-15 17:48:34
【问题描述】:
灵感来自this question。
我们知道具有非constexpr 初始化器的全局变量会经历两种不同的“初始化”:
- 首先是“静态初始化”,对它们进行零初始化。
- 二是“动态初始化”,它使用用户提供的初始化器。
哪些初始化会启动变量的生命周期? [basic.life] 出人意料地没有帮助:
对象的生命周期...开始于:...其初始化(如果有)完成
我看到了几个选项:
- 最后一次初始化开始生命周期。
- 第一次初始化开始生命周期。
- 每次连续初始化都会破坏现有对象并在其位置创建一个新对象。
(1) 最有意义,但它会使稍后将动态初始化的对象的静态初始化几乎无用。
(2) 会产生有趣的效果。例如。静态初始化顺序惨败突然不再是 UB(本身)。
(3) 会很奇怪。
【问题讨论】:
-
我不认为零初始化开始了对象的生命周期。至少对于类类型。我不相信它调用任何构造函数,所以你不能保证任何不变性。我总是将其解释为零初始化只是在实际初始化发生之前将底层表示归零。
-
@FrançoisAndrieux 不管构造函数是否被调用。参见[dcl.init.general] p19:一个已完成初始化的对象被视为已构造,即使该对象是非类类型或没有调用该对象类的构造函数进行初始化。我>
标签: c++ language-lawyer