假设我有以下代码:
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节来解决这个问题。但我没有找到一个好的答案。我非常感谢您在起草答案时能够指出我的标准部分。 谢谢你的帮助。
答案 0 :(得分:5)
订单未定义。
假设你有两个静态对象x和y,它们分开存在 源文件,比如x.cpp和y.cpp。进一步假设 y对象的初始化(通常是y对象的构造函数) 在x对象上调用一些方法。
就是这样。就这么简单。
悲剧在于你有50%-50%的死亡几率。如果 x.cpp的编译单元首先被初始化,一切都是 好。但是如果y.cpp的编译单元首先被初始化, 然后y的初始化将在x的初始化之前运行,并且 你敬酒。例如,y的构造函数可以在x上调用方法 对象,但x对象尚未构建。
并查看How do I prevent the "static initialization order fiasco"?。
答案 1 :(得分:3)
未定义;比照What's the "static initialization order fiasco"?。标准中的相关部分是§3.6.2“非局部变量的初始化”,即
否则,对于在不同翻译单元中定义的变量的初始化,变量的初始化是不确定的。