Se garantiza la inicialización del objeto estático

Estoy tratando de aprender acerca de la inicialización de objetos estáticos. La inicialización estática parece bastante sencilla, asumiendo que usted comprende expresiones constantes yconstexpr. La inicialización dinámica parece un poco más complicada.

[basic.start.init] / 4

La implementación se define si la inicialización dinámica de una variable no local con duración de almacenamiento estático se realiza antes de la primera declaración de main. Si la inicialización se aplaza a algún punto en el tiempo después de la primera declaración de main, se producirá antes del primer uso estándar (3.2) de cualquier función o variable de fi nida en la misma unidad de traducción que la variable a inicializar.

nota 34

Una variable no local con duración de almacenamiento estático que tiene la inicialización con efectos secundarios debe inicializarse incluso si no se utiliza de forma estándar (3.2, 3.7.1).

[basic.start.init] / 5

La implementación se de fi ne si la inicialización dinámica de una variable no local con una duración de almacenamiento de subprocesos o estática se realiza antes de la primera declaración de la función inicial del subproceso. Si la inicialización se aplaza hasta algún punto en el tiempo después de la primera declaración de la función inicial del subproceso, se producirá antes del primer uso estándar (3.2) de cualquier variable con la duración de almacenamiento de subprocesos definida en la misma unidad de traducción que la variable para ser inicializado.

Supongo que "la función inicial del hilo" se refiere a main, y no solo a los hilos iniciados con std :: thread.

h1.h

#ifndef H1_H_
#define H1_H_

extern int count;

#endif

tu1.cpp

#include "h1.h"

struct S
{
   S()
   {
      ++count;
   }
};

S s;

tu2.cpp

#include "h1.h"

int main(int argc, char *argv[])
{
   return count;
}

tu3.cpp

#include "h1.h"

int count;

Entonces, si un compilador difiere la inicialización dinámica, parece que la nota 34 establece ques debe ser inicializado en algún momento Dado que no hay otras variables con inicialización dinámica en la unidad de traducción, no hay otra variable para usar odr para forzar la inicialización de las variables en tu1. En que punto ess ¿Garantizado haber sido inicializado?

¿El principal está garantizado para devolver 1? Además, ¿hay alguna manera de cambiar este programa de modo que ya no se garantice que se devuelva 1? Alternativamente, si no está garantizado, ¿hay alguna manera de cambiar este programa para que se garantice?

Rompí el código para que la definición des está en una unidad de traducción diferente demain. Esto evita la cuestión de simain es odr utilizado. Dado ques es el único objeto en la unidad de traducción, ¿está garantizado quemain volverá 1?

Respuestas a la pregunta(3)

Su respuesta a la pregunta