C++ C++;11:std ref全局变量和非函数局部线程\u局部初始化顺序?
在C++11中,带有非平凡构造函数的全局变量是在静态初始化阶段在进入main之前构造的 同样,在每个线程的“线程本地初始化阶段”中构造非函数本地线程本地变量 C++11标准是否规定了这些变量的构造顺序?在这两种情况下,如果有两个变量:C++ C++;11:std ref全局变量和非函数局部线程\u局部初始化顺序?,c++,c++11,language-lawyer,C++,C++11,Language Lawyer,在C++11中,带有非平凡构造函数的全局变量是在静态初始化阶段在进入main之前构造的 同样,在每个线程的“线程本地初始化阶段”中构造非函数本地线程本地变量 C++11标准是否规定了这些变量的构造顺序?在这两种情况下,如果有两个变量: // global scope A::A() { b.f(); } // A constructor uses global b A a; B b; C++11标准是否规定了初始化顺序,或者如果未初始化使用变量,则应产生错误 同样,对于非函数本地线程_lo
// global scope
A::A() { b.f(); } // A constructor uses global b
A a;
B b;
C++11标准是否规定了初始化顺序,或者如果未初始化使用变量,则应产生错误
同样,对于非函数本地线程_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是,然后标准说
在单个变量中定义了有序初始化的变量
翻译单元应按照其顺序进行初始化
翻译单位中的定义
3.6.2/2涵盖了所有这些
编辑:据我所知,您的第二个a和b没有顺序初始化,可以按任意顺序初始化。但是我可能遗漏了一些东西。对于静态存储持续时间,我同意Alan的回答。如果初始化在同一个转换单元中,则它们的动态初始化是这些对象定义的顺序。允许编译器将
b
初始化为静态初始化,但前提是编译器能够确定如何进行初始化(根据3.6.2/3)。因此,第一个程序可能调用也可能不调用未定义的行为,这可能是个坏主意
对于动态存储持续时间,注3.7.2/2:
具有线程存储持续时间的变量应在其第一次odr使用(3.2)之前初始化,如果构造,应在线程退出时销毁
因此,线程局部变量的行为更像函数局部静态变量,而不是命名空间范围静态变量。第二个程序没有未定义的行为。也许您可以重命名第二个示例中的变量,以便更清楚地说明答案所指的内容。在第一种情况下,如果b是动态初始化的,则行为不一定是未定义的。第二种情况下,b将在a的构造函数运行之前初始化为零。这种行为不太可能有帮助,但这是另一个问题。