C++11:std ref 全局变量和非函数局部 thread_local 初始化顺序?

标签 c++ c++11 language-lawyer

C++11 中具有非平凡构造函数的全局变量是在静态初始化阶段在进入 main 之前构造的。

同样,非函数局部 thread_local 变量是在每个线程的“thread_local 初始化阶段”构建的。

C++11 标准是否规定了这些变量的构造顺序?在这两种情况下,如果有两个变量:

// global scope

A::A() { b.f(); }  // A constructor uses global b

A a;
B b;

C++11 标准是否指定了它们应按什么顺序进行初始化,或者如果使用未初始化的变量应该产生错误?

同样适用于非函数本地 thread_local:

// global scope

A::A() { b.f(); }  // A constructor uses global b

thread_local A a;
thread_local B b;

标准是否指定了它们必须构造的顺序,它是否定义了如果变量在初始化之前从另一个构造函数中使用会发生什么?

能否请您提供一份C++11 标准引用来支持您提出的任何要求,以获得答案。

最佳答案

您的声明“C++11 中具有非平凡构造函数的全局变量是在静态初始化阶段在进入 main 之前构造的。”似乎并不完全正确——它们可能要到动态初始化阶段才会被初始化

对于具有“有序初始化”的变量,您的第一个 a 和 b 是,然后标准说

Variables with ordered initialization defined within a single translation unit shall be initialized in the order of their definitions in the translation unit.

3.6.2/2 涵盖了所有这些。

编辑:据我所知,您的第二个 a 和 b 没有有序初始化,可以按任一顺序初始化。但我可能遗漏了一些东西。

关于C++11:std ref 全局变量和非函数局部 thread_local 初始化顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13110522/

相关文章:

c++ - 如何使 html 内容适合 QWebView 大小

python - 如何通过共享内存将 cv::Mat 发送到 python?

c++ - 在 lambda 中捕获的 constexpr 变量失去了它的 constexpr-ness

用于类型和非类型模板的 c++ auto

c++ - 使用 Boost::Python 获取指向 Python 实例的 C++ 指针

c++ - C/C++ 赋值运算符实现的底层细节。它返回什么?

c++ - 是否可以推迟仿函数的生成?

c++ - 如何对接口(interface)的引用进行延迟评估(尝试使用绑定(bind))?

c++ - 在这种情况下正确使用移动语义?

c++ - 获取重载函数模板的地址是可能的,有时