Это распространенная проблема, известная как статический порядок инициализации fiasco .
Объекты со статической продолжительностью хранения в области именного пространства создаются в порядке переводаединица, но вы не знаете, могут ли инициализироваться те, которые находятся в других единицах перевода, вначале.
Вместо того, чтобы ваш контейнер находился в области имен, сделайте его статическим (возможно, возвращенным из новогоGetRegistry()
функция?) Так что она построена при первом использовании.Это может быть использование из main
, использование из инициализации другой «вещи» статической длительности (вероятно, откуда поступает ваш вызов Register
), использование с Луны…
Это также почемуправильный способ написать одиночный код - это иметь GetInstance()
функцию, которая объявляет (static
ly!) экземпляр в пределах области действия функции.
Решение будетустановить статическое значение bool isInitialized = false и затем соответствующим образом инициализировать карту.Но я надеюсь, что этого можно избежать.
Нет.Тогда у вас будет не только та же проблема с флагом isInitialized
, но вы ничего не сможете сделать с этой информацией.Вы не можете «инициализировать» что-либо кроме инициализатора, и вся проблема в том, что инициализатор еще не использовался.Вы можете назначить карту, но это будет иметь неопределенное поведение, потому что вы будете назначать что-то, что еще не существует ... и тогда это все равно будет инициализировано позже!