我知道 C++ 中的静态初始化顺序存在很大问题,基本上没有跨翻译单元的保证,但是在同一个翻译单元中应该保证静态对象被初始化以便它们出现。那么为什么会这样呢?
#include <iostream>
struct Foo {};
class SequentialTypeIDDispenser
{
private:
static inline int count = 0;
public:
static int init() { std::cout << "initialising static member\n"; return count++; }
template <typename type>
static inline int ID = init();
};
class Horse
{public:
static char init()
{
// Doesn't work, prints 0 all three times
std::cout << SequentialTypeIDDispenser::template ID<char> << "\n";
std::cout << SequentialTypeIDDispenser::template ID<double> << "\n";
std::cout << SequentialTypeIDDispenser::template ID<float> << "\n";
return 0;
}
static inline char member = init();
// Why is this being initialised before the static
// members of the above class?
};
int main()
{
// Now it works
std::cout << SequentialTypeIDDispenser::template ID<char> << "\n";
std::cout << SequentialTypeIDDispenser::template ID<double> << "\n";
std::cout << SequentialTypeIDDispenser::template ID<float> << "\n";
Horse horse;
}
打印输出为:
0
0
0
initialising static member
initialising static member
initialising static member
0
1
2
因此,我们遇到了一个静态类成员在其上方的静态类成员之前被初始化的情况。为什么会这样?
另外,还有一个我不明白的问题,为什么如果程序还没有开始初始化 ID,为什么它打印 0?这和未定义的意外一样吗?