这个特定代码是否容易出现静态初始化顺序惨败?即我可以假设当我访问B的静态成员函数时,编译单元“B”中的静态初始化已经完成了吗?
// a.h
struct A {
static int foo();
static int var;
}
// a.cpp
#include <a.h>
int A::foo() {
return var;
}
int A::var = 42;
// b.h
struct B {
B::B();
static int var;
}
// b.cpp
#include <b.h>
#include <a.h>
B::B() {
var = A::foo();
}
// c.h
struct C {
static B b;
}
// c.cpp
B C::b;
或者我有这样的代码:
// a.h
static int &A::var();
// a.cpp
int &A::var() {
static value = 42;
return value;
}
int A::foo() {
return var();
}
赞赏参考标准。
答案 0 :(得分:3)
是的,通过静态功能访问时可以看到问题 见下面的例子保证失败。
解决此问题的方法不是在main启动之前访问“静态存储持续时间对象”。
如果由于某种原因你需要从“静态存储持续时间对象”的构造函数中访问对象,那么这些对象应该被包装起来,以便在使用之前保证它们是完全构造的。执行此操作的最佳方法是使用“静态函数对象”(一种根据需要构造的静态存储持续时间对象)。
// a.cpp
MyType& A::getInstance()
{
static MyType myInstance;
return myInstance;
}
保证失败的例子:
struct A
{
static A instanceA1;
static A& getInstance() { return instanceA1;}
};
struct B
{
static B instanceB1;
static B& getInstance() { return instnaceB1;}
A& member;
B(): member(A::getInstance()) {}
}
B B::instanceB1; // Constructure uses A::getInstance() which returns A::instance
// But A::instance has not been constructed yet.
// Order of instanciation in the same compilation unit is guranteed
// So we know this will not work.
A A::instanceA1;