Код для построения g_init
изменяет OnPrepare
.Это, конечно, допустимо, только если OnPrepare
уже построено.Но что, если g_init
построен до OnPrepare
?Затем вы будете модифицировать объект, который еще не был создан, а затем создадите уже измененный объект.Уч.Выполнение реальной работы в конструкторах статических объектов никогда не является хорошей идеей.
Не ясно, какова ваша внешняя проблема, но этот код не является хорошим способом ее решения.Ужасный обходной путь - заменить глобальную std::function
глобальной функцией, которая возвращает ссылку на статическую функцию std::function
, и использовать ее.Это гарантирует, что объект создается до того, как ему присвоить.
std::function<void()>& getOnPrepare()
{
static std::function<void()> OnPrepare;
return OnPrepare;
}
Тогда конструктор Init
может вызвать getOnPrepare
, гарантируя, что OnPrepare
создан до того, как ему присвоено:
Init() {
getOnPrepare() = []() {
TRACE("hello, world!\n");
};