C++ 静态类变量是否总是在调用其静态实例的构造函数之前初始化?
考虑下面代码中的情况C++ 静态类变量是否总是在调用其静态实例的构造函数之前初始化?,c++,static,initialization,C++,Static,Initialization,考虑下面代码中的情况 //Foo.h #包括 福班 { 公众: Foo() { 放回(这个); } 私人: 静态std::向量foos; }; //Foo.cpp std::vector Foo::foos; //Bar.h 分类栏 { 私人: 静态Foo-Foo; }; //Bar.cpp Foo-Bar::Foo; 意识到静态初始化顺序的失败,我是否可以假设Foo::foos总是在调用Bar::Foo构造函数之前初始化,或者该顺序仍然未指定 在我看来,它取决于所使用的类型,但在我的情
//Foo.h
#包括
福班
{
公众:
Foo()
{
放回(这个);
}
私人:
静态std::向量foos;
};
//Foo.cpp
std::vector Foo::foos;
//Bar.h
分类栏
{
私人:
静态Foo-Foo;
};
//Bar.cpp
Foo-Bar::Foo;
意识到静态初始化顺序的失败,我是否可以假设Foo::foos
总是在调用Bar::Foo
构造函数之前初始化,或者该顺序仍然未指定
在我看来,它取决于所使用的类型,但在我的情况下,这种假设是无效的,因为
std::vector
没有constepr
构造函数,所以它的初始化是在非局部变量初始化的动态初始化步骤中执行的,这同样适用于Foo
。这是真的吗?我不这么认为。它可能仍然是UB…它是UB,除非在同一编译单元中定义了Foo::foos
和Bar:Foo
,在这种情况下,它是定义的顺序。请解释您链接的部分的哪些部分建议指定顺序。@molbdnilo我链接的部分不建议在我的案例中指定顺序,恰恰相反,我在问题中指出了这一点。如果我理解正确,那么在满足std::vector
的情况下,将指定顺序。此类情况的标准解决方法是将“早期静态变量”放入函数(返回对它的引用)中,以便在第一次调用时对其进行初始化。