Всегда ли статическая переменная класса инициализируется перед вызовом конструктора ее статического экземпляра? - PullRequest
3 голосов
/ 05 мая 2019

Рассмотрим ситуацию, подобную приведенной ниже.

// Foo.h
#include <vector>

class Foo
{
public:
    Foo()
    {
        foos.emplace_back(this);
    }

private:
    static std::vector<Foo*> foos;
};
// Foo.cpp
std::vector<Foo*> Foo::foos;
// Bar.h
class Bar
{
private:
    static Foo foo;
};
// Bar.cpp
Foo Bar::foo;

Зная о статическом порядке инициализации Fiasco, могу ли я предположить, что Foo::foos всегда будет инициализироваться до вызова конструктора Bar::foo или порядок еще не определен?

Из того, что я собрал , мне кажется, что это зависит от используемых типов, но в моем случае такое предположение недопустимо, поскольку std::vector не имеет конструктора constexpr, поэтому его инициализация выполняется во время шага динамической инициализации инициализации нелокальной переменной, и то же самое относится к Foo. Это правда?

...