¿Por qué las variables globales en línea y los miembros en línea estáticos en C++ 17 necesitan protectores?
c++17 inline (1)
Cada archivo que contenga la definición y la use intentará inicializar la variable. Incluso si eso sucede en serie, no al mismo tiempo, aún necesita una forma de marcar la variable como inicializada, de modo que solo la primera aparición la inicializará y luego los intentos de inicializarla no harán nada.
Además, puede tener varios subprocesos antes de los inicios
main
.
Los constructores de variables globales (y funciones llamadas por esos constructores) pueden generar nuevos hilos.
Por lo tanto, puede tener varios fragmentos de código, todos ejecutándose antes de
main
, todos intentando inicializar la misma variable.
Para eso son los guardias.
Desde C ++ 17 es posible inicializar variables globales y miembros estáticos en los encabezados utilizando la palabra clave en
inline
.
Si bien entiendo por qué las variables estáticas en las funciones deben estar protegidas (porque la inicialización debe ocurrir solo una vez, incluso en un contexto multiproceso), no entiendo por qué estas nuevas variables en línea también están protegidas (puede verlo aquí:
https://godbolt.org/z/YF8PeQ
).
Pensé que, en cualquier caso, la inicialización de todos los elementos globales y estáticos ocurre al principio de la ejecución del programa (incluso antes de
main()
), por lo que no es necesario pensar en varios subprocesos en este momento.
¿Puedes explicarlo, por favor?