我正在尝试了解静态对象的初始化。假设您了解常量表达式和constexpr
. 动态初始化似乎有点棘手。
[basic.start.init]/4
具有静态存储持续时间的非局部变量的动态初始化是否在 main 的第一条语句之前完成是实现定义的。如果初始化推迟到 main 的第一个语句之后的某个时间点,它应该发生在与要初始化的变量在同一翻译单元中定义的任何函数或变量的第一次 odr-use (3.2) 之前。
脚注 34
一个具有静态存储持续时间且具有副作用的初始化的非局部变量必须被初始化,即使它不是 odr-used (3.2, 3.7.1)。
[basic.start.init]/5
具有静态或线程存储持续时间的非局部变量的动态初始化是否在线程的初始函数的第一条语句之前完成是实现定义的。如果初始化延迟到线程初始函数的第一个语句之后的某个时间点,它应该发生在任何变量的第一次 odr-use (3.2) 之前,该变量的线程存储持续时间与变量定义在同一翻译单元中被初始化。
我假设“线程的初始函数”是指主线程,而不仅仅是以 std::thread 开头的线程。
h1.h
#ifndef H1_H_
#define H1_H_
extern int count;
#endif
tu1.cpp
#include "h1.h"
struct S
{
S()
{
++count;
}
};
S s;
tu2.cpp
#include "h1.h"
int main(int argc, char *argv[])
{
return count;
}
tu3.cpp
#include "h1.h"
int count;
因此,如果编译器推迟动态初始化,脚注 34 似乎表明s
必须在某个时候进行初始化。由于翻译单元中没有其他具有动态初始化的变量,因此没有其他变量可以使用 odr 来强制初始化 tu1 中的变量。什么时候可以s
保证已经初始化?
main 是否保证返回 1?另外,有没有办法改变这个程序,使它不再保证返回 1?或者,如果不能保证,有没有办法改变这个程序,使它变得有保证?
我分解了代码,以便 的定义s
与main
. 这避免了是否main
使用 odr 的问题。鉴于这s
是翻译单元中唯一的对象,是否保证main
会返回 1?