我预计以下代码会产生分段错误(或其他UB):
struct T {
T();
};
T t;
char const* str = "Test string";
T::T() {
std::cout << str; // zero-initialised, only!
}
int main() {}
Run Code Online (Sandbox Code Playgroud)
那是因为t之前已经初始化了str.我期望由于零初始化而str保持该值(char const*)0.我的解释[C++11: 3.6.2/2]支持这一点.
但是,上面的代码片段似乎按预期输出了字符串(我也通过打印指针的值来确认行为).
我是否缺少一些静态初始化规则,允许str在t开始构建之前进行值初始化?标准在哪里?
这在构建时出现了静态变量解析,其中一个回答者断言使用char const*而不是std::string静态全局避免了静态初始化顺序惨败.我不同意,但现在我不太确定......