保证非 odr 使用的全局变量的延迟动态初始化

Mar*_*tin 4 c++ std c++17

考虑以下由两个 组成的完整程序TU

// 1.cpp
bool init() { /* ... */ }
const auto _{init()};

// 2.cpp
int main() {}
Run Code Online (Sandbox Code Playgroud)

问题:是否可以保证 _ 在某个时候初始化(我不在乎什么时候)?

现在考虑由一个组成的程序TU

// 1.cpp
bool init() { /* ... */ }
const auto _{init()};
int main() {}
Run Code Online (Sandbox Code Playgroud)

请注意 _ 不是odr-used

但是,main()在第二种情况下,是否可以说是odr-used,因为它在程序运行时被调用时(有点)“被实现引用”?

如果main()odr-used,这是否意味着 _ 保证被初始化,即使它不是odr-used

编辑:

这就是en.cppreference.com关于延迟动态初始化的说法:

如果没有从给定的翻译单元 odr 使用变量或函数,则该翻译单元中定义的非局部变量可能永远不会被初始化(这对按需动态库的行为进行建模)

在阅读我的两个例子时,你能回答我的问题吗?

Whi*_*TiM 5

据说链接器的工作是在程序启动期间从所有翻译单元中整理所有具有静态存储持续时间的对象以进行初始化- 然而,它不止于此,保证这些对象将在使用其中的任何函数之前被初始化翻译单位

basic.start.static/1:作为程序启动的结果,具有静态存储持续时间的变量被初始化......

另见:

basic.stc.static/2:如果具有静态存储持续时间的变量具有初始化或具有副作用的析构函数,则即使它看起来未使用,也不应将其消除...