Да, вы можете увидеть проблему при доступе через статическую функцию.
См. Пример ниже гарантированно не удастся.
Способ решить эту проблему - не получить доступ к «объектам длительности статического хранения» до запуска 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;