Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 静态类变量是否总是在调用其静态实例的构造函数之前初始化?_C++_Static_Initialization - Fatal编程技术网

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
的情况下,将指定顺序。此类情况的标准解决方法是将“早期静态变量”放入函数(返回对它的引用)中,以便在第一次调用时对其进行初始化。