c++ - 内置类型的对象是否具有特殊的静态初始化顺序优先级?

标签 c++ static-initializer

我预计以下代码会产生段错误(或其他 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 (我还通过打印指针的值来确认该行为)。

是否有一些我在这里遗漏的静态初始化规则,允许 strt 开始构建之前进行值初始化?它在标准中的什么位置?


这是在 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/

相关文章:

java - Java 中的静态/实例初始化程序 block 按什么顺序运行?

java - 再次调用静态初始化器

c++ - 在 C++ 中创建类型未知的模板 vector (空模板)

c++ - 这篇代码文章中的 "cached function"指的是什么?

Java:构造Locale对象时NullPointerException导致的ExceptionInInitializerError

java - 我可以保证静态初始化程序在 Java 中的运行顺序吗?

c++ - 将值插入以不同方式排序的两个BST中

c++ - 使用列表语法中的删除更正迭代

c++ - 为什么将 const 添加到从迭代器中提取的这对字符串中?

ios - 重写 NSMutableUrlRequest 静态初始化程序?