Ну, «Глобальные переменные инициализируются в порядке появления в модуле перевода», это точно.Он не оставляет места для чего-либо еще, например, пространств имен, влиять на порядок.
На самом деле, «Глобальные переменные инициализируются по порядку ...» - это неточная цитата стандарта, так как формально неверна.Точная формулировка из стандарта C ++, ISO / IEC 14882: 2003, 3.6.2 параграфа 1:
Объекты со статической продолжительностью хранения, определенной в области пространства имен в той же единице перевода и динамически инициализированной, должны быть инициализированыв том порядке, в котором их определение появляется в единице перевода.
Таким образом, вместо слова «глобальный» он говорит «со статическим хранилищем», то есть все нелокальные переменные, являются ли они глобальными, членами пространства именили члены класса и объявлены ли они static
или нет.
Также он добавляет "и динамически инициализируется".Переменные с тривиальными конструкторами и инициализатором констант всегда сначала инициализируются (просто загружая их значения из двоичного файла), а затем оцениваются все неконстантные инициализаторы, и нетривиальные конструкторы выполняются в этом порядке.Это важно, так что вы можете, например, надежно создать связанный список в этих конструкторах;если его заголовок имеет простой указатель, он уже инициализирован, поэтому вы можете безопасно с ним работать.