Bueno, las "variables globales se inicializan para aparecer en el módulo de traducción" es definitiva. No deja espacio para nada más, como espacios de nombres, para afectar el orden.
En realidad, "Las variables globales se inicializan en orden ..." es una cita imprecisa de la norma, ya que es formalmente incorrecta. Las palabras exactas de C++ estándar, ISO/IEC 14882: 2003, 3.6.2 párrafo 1 es:
objetos con una duración de almacenamiento estático se define en el ámbito del espacio de nombres en la misma unidad de traducción y dinámicamente inicializado se inicializan en el orden en que aparece su definición en la unidad de traducción.
Así que en lugar de "global" que dice "con el almacenamiento estático", es decir todas las variables no locales si son miembros del espacio de nombres global, o miembros de la clase y si son declarados static
o no.
También agrega "y se inicializa dinámicamente". Las variables con constructores triviales e inicializador constante siempre se inicializan primero (simplemente cargando sus valores desde el binario) y luego de que todos los inicializadores no constantes se evalúan y los constructores no triviales se ejecutan en ese orden. Esto es importante, por lo que puede, por ejemplo, crear de forma confiable una lista vinculada en esos constructores; si su cabecera es un puntero simple, ya está inicializado, por lo que puede trabajar con ella de forma segura.
Tenga en cuenta que el estándar C++ define que los nombres globales son solo aquellos que aparecen en el ámbito global ([basic.scope.namespace]/3). Por lo que respecta a C++, en second.cpp 'first' no es global. Obviamente para todos los propósitos prácticos de hacer con "globales" y especialmente "globales" mutables siendo un PITA para trabajar, en todos los lenguajes de programación, es un "global". –