在给定的翻译单元中,文件级静态变量的顺序是否始终相同?

Omn*_*ous 5 c++ initialization static-initialization static-order-fiasco

我有一个程序分为两个源文件:

example.cpp

#include <iostream>

class A {
 public:
   A(int x) {
      ::std::cout << "In A(" << x << ")\n";
   }
};

static A first(1);
static A second(2);
Run Code Online (Sandbox Code Playgroud)

例子 __ main.cpp

int main(int argc, const char *argv[])
{
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

该计划的输出是否保证为:

In A(1)
In A(2)
Run Code Online (Sandbox Code Playgroud)

在所有平台和编译器上?如果是这样,它在标准中的位置是这样说的吗?如果我使用名称空间first并且second出现在不同的名称空间中,这是否重要?如果它们不是静态的并且我使用匿名命名空间怎么样?

cpx*_*cpx 5

是的,如果声明出现在同一个翻译单元中,则为非本地静态对象定义初始化顺序.

来自C++ 03,

(3.6/2)在同一翻译单元的命名空间范围内定义并动态初始化的静态存储持续时间的对象应按其定义在翻译单元中出现的顺序进行初始化.[注意:8.5.1描述了初始化聚合成员的顺序.6.7中描述了本地静态对象的初始化.]