【发布时间】:2013-09-03 19:30:16
【问题描述】:
我正在尝试了解静态对象的初始化。假设您了解常量表达式和constexpr,静态初始化似乎很简单。动态初始化似乎有点棘手。
[basic.start.init]/4
是否在 main 的第一条语句之前完成具有静态存储持续时间的非局部变量的动态初始化是实现定义的。如果初始化延迟到 main 的第一个语句之后的某个时间点,它应该发生在与要初始化的变量在同一翻译单元中定义的任何函数或变量的第一次 odr-use (3.2) 之前。
脚注 34
具有静态存储持续时间且具有副作用的初始化的非局部变量必须被初始化,即使它没有被 odr 使用(3.2、3.7.1)。
[basic.start.init]/5
在线程的初始函数的第一个语句之前是否完成具有静态或线程存储持续时间的非局部变量的动态初始化是由实现定义的。如果初始化延迟到线程初始函数的第一个语句之后的某个时间点,它应该发生在任何变量的第一次 odr-use (3.2) 之前,该变量的线程存储持续时间与变量定义在同一翻译单元中被初始化。
我假设“线程的初始函数”指的是 main,而不仅仅是以 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 是否被使用的问题。鉴于s 是翻译单元中唯一的对象,是否保证main 将返回1?
【问题讨论】: