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/