4

假设我有以下代码:

extern std::string first_string; //defined in another file
std::string another_string(first_string + "some other string");

我的问题是:

first_string它是否由总是在之前初始化的标准来保证another_string

如果不是,在实践中应该避免这样的代码吗?

我试图通过阅读 C++ 标准 N3485 第 3.6 和 3.7 节来解决这个问题。但是我没有找到好的答案。如果您在起草答案时能指出标准的部分内容,我将不胜感激。感谢您的帮助。

4

2 回答 2

5

订单未定义。

C++ 常见问题解答

假设您有两个静态对象 x 和 y,它们存在于单独的源文件中,例如 x.cpp 和 y.cpp。进一步假设 y 对象的初始化(通常是 y 对象的构造函数)调用 x 对象上的某个方法。

就是这样。就是这么简单。

悲剧是你有50%-50%的几率死亡。如果 x.cpp 的编译单元恰好首先被初始化,那么一切都很好。但是如果 y.cpp 的编译单元首先被初始化,那么 y 的初始化将在 x 的初始化之前运行,你就完了。例如,y 的构造函数可以调用 x 对象的方法,但尚未构造 x 对象。

看看如何防止“静态初始化顺序惨败”?.

于 2013-05-28T01:28:57.117 回答
3

这是未定义的;参看。什么是“静态初始化订单惨败”?. 标准中的相关部分是§3.6.2“非局部变量的初始化”,其中说

否则,变量的初始化相对于在不同翻译单元中定义的变量的初始化是不确定的。

于 2013-05-28T01:33:12.990 回答