parent的静态变量是否保证在child的静态变量之前被初始化?

Is parent's static variables guaranteed to be initialized before child's static variables?

我的 C++ 代码如下所示

Parent.hpp

class Parent {
    static std::map<std::string, std::function<void()>> list;
}

Parent.cpp

#include "Parent.hpp"
std::map<std::string, std::function<void()>> Parent::list;

Child.hpp

#include "Parent.hpp"
class Child : Parent {
    static bool isRegistered = registerComponent();
    std::function<void(GameObject* go, void* arr)> add;
    static bool registerComponent();

Child.cpp

#include "Child.hpp"
    static bool Child::isRegistered = registerComponent();
    std::function<void(GameObject* go, void* arr)> Child::add = []() {
        //do something
    }
    static bool Child::registerComponent() {
        if (add) {
            list["child"] = Child::add;
            return true;
        }
        else return false
    }

是否保证list在我调用registerComponent()之前被初始化?我读过这个 post When are static C++ class members initialized? 我认为不能保证,但我不是 100% 确定。

不,不是。按照你写的方式,listChild 的静态成员之间没有初始化顺序保证。

保证的是静态数据在其翻译单元中的任何函数的任何使用(根据一个定义规则,即)之前被初始化。因此,如果您要让 registerComponent 成为 Parent 的成员,父 class 及其子项之间的一切都会好起来的。

class Parent {
    static std::map<std::string, std::function<void()>> list;
  protected:
    // Implemented in the same TU where list is defined
    static bool registerComponent(std::string k, std::function<void()> v);
};

现在任何调用 registerComponent 的子 class 都将使用定义 list 的翻译单元中的函数,因此 list 肯定会在函数被初始化之前初始化已执行。