我预计以下代码会产生段错误(或其他 UB):
struct T {
T();
};
T t;
char const* str = "Test string";
T::T() {
std::cout << str; // zero-initialised, only!
}
int main() {}
那是因为t
是在str
之前初始化的。由于零初始化,我希望 str
保持值 (char const*)0
。我对 [C++11: 3.6.2/2]
的解释支持这一点。
然而,the above snippet appears to output the string as expected (我还通过打印指针的值来确认该行为)。
是否有一些我在这里遗漏的静态初始化规则,允许 str
在 t
开始构建之前进行值初始化?它在标准中的什么位置?
这是在 static variable resolution at build time 上出现的,其中回答者断言使用 char const*
而不是 std::string
静态全局避免静态初始化顺序惨败。我不同意,但现在我不太确定...
最佳答案
str
由常量表达式初始化,const char *
是 POD 类型(C++03 术语,但 C++11 是类似的,但与不同的条款和更多允许的情况)。这样的初始化是在static初始化阶段完成的,static初始化阶段没有顺序问题。它发生在任何动态 初始化之前。 t
在动态 初始化阶段被初始化。
关于c++ - 内置类型的对象是否具有特殊的静态初始化顺序优先级?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8750407/