Нет, это не так. Как вы и написали, нет порядка порядка инициализации между list
и статическими членами Child
.
Что гарантируется , так это то, что статические данные инициализируются перед любым использованием (в соответствии с правилом одного определения) любой функции в их единице перевода. Так что если вы сделаете registerComponent
членом Parent
, все будет хорошо между классом Parent и его потомками.
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
, будет использовать функцию из модуля перевода, который определил list
, поэтому list
обязательно будет инициализирован перед выполнением функции.