Конкретный тип инициализации, о котором, я думаю, вы говорите:
По сути, я спрашиваю: неужели кто-то не согласен с тем, что статические простые типы C (не-объекты), такие как char,short, int и long (и структуры без конструкторов, состоящих из этих типов) инициализируются при загрузке исполняемого файла в память перед вызовом main () или любого другого конструктора?
Полагаю, вы имеете в видучто инициализация с константами - не путем вызова функции.Если это предположение верно, то да, вы можете быть уверены, что инициализация произойдет до вызова любых конструкторов:
- 3.6.2 инициализация нелокальных объектов
Объекты со статической продолжительностью хранения (3.7.1) должны быть инициализированы нулями (8.5) перед любой другой инициализацией.Обнуление инициализации и инициализация с постоянным выражением вместе называются статической инициализацией;все остальные инициализации - это динамическая инициализация. Объекты типов POD (3.9) со статической продолжительностью хранения, инициализированной с помощью константных выражений (5.19), должны быть инициализированы перед любой динамической инициализацией. Объекты со статической продолжительностью хранения, определенной в области пространства имен в той же единице перевода и динамическиinitialized должно быть инициализировано в том порядке, в котором их определение появляется в единице перевода.
Однако инициализация, такая как
static int x = getvalue();
, попадает в категорию динамической инициализации, поэтому она получаетупорядочено по внешнему виду (и неопределенно между различными единицами перевода).
Еще одно предостережение: это не относится к локальной статике (которая может не инициализироваться, пока не введен их блок), но это действительно не имеет значениятак как они недоступны для чего-либо еще, пока не будет введен вмещающий блок.