Стандарт C ++ 11 гласит, § 3.6.2, 4:
«Это определяется реализацией, выполняется ли динамическая инициализация нелокальной переменной со статической продолжительностью хранения перед первым оператором main».
Стандарт C ++ отличает статическую инициализацию, которая требует только оценки констант времени компиляции, от динамической инициализации. Я считаю, что наблюдаемые эффекты активной статической инициализации гарантированы. Я заинтересован в нетерпеливой инициализации в любом случае.
Учитывая, что это поведение определяется реализацией и учитывая существующие реализации, существует ли хороший переносимый способ принудительной инициализации? Это решение, принятое компилятором или компоновщиком? Я думаю, что dlopen () с RTLD_NOW дает такое поведение, так что я подозреваю, что это возможно, и что это опция компоновщика.
Чтобы быть конкретным, я хочу динамически связывать библиотеки и иметь конструкторы для глобальных переменных, запускаемых перед main ().
Пример возможного использования можно найти в этом вопросе:
Идея состоит в том, чтобы иметь некоторый глобальный реестр классов, к которому осуществляется доступ в основной функции, и к которым можно добавлять классы в динамически связанных библиотеках, инициализируя статическую переменную. Эта статическая переменная захватывает глобальный реестр и добавляет что-то к нему. Это работает иногда но ненадежен и непредсказуем, потому что это зависит от неопределенного поведения.
Задача ещё не решена.