g ++ y clang ++ comportamiento diferente con la inicialización recursiva de un miembro estático

 C Programming >> Programación C >  >> Tags >> Clang
g ++ y clang ++ comportamiento diferente con la inicialización recursiva de un miembro estático

No está especificado. Ambos compiladores tienen razón.

Aquí están las piezas relevantes de la "inicialización" de cppreference.

Inicialización estática

Entonces, para todas estas variables, son cero cuando se carga el programa. Entonces:

Inicialización dinámica

Y estas variables coinciden con los criterios. Y luego dice:

Lo que significa que cualquier secuencia de inicialización está bien. Ambos compiladores son correctos.

Para evitar el problema, use constexpr para forzar una "inicialización constante" en su lugar.


Es sin especificar .

Estás usando una construcción donde hace referencia a una definición de variable sobre sí misma, tal vez algo análogo a decir int i = i-1 . En el caso de clang, solo está usando la definición de plantilla genérica

template <std::size_t N>
struct foo
  { static std::size_t value; };//without specialization this will be ZERO initialized

porque no ha visto 'en sí mismo' como lo haría una función o clase de plantilla normal (a diferencia del caso gcc).

En resumen:

1) Legítimo

2) Sin especificar

Para evitar problemas, utilice constexpr y especialice la plantilla de clase en su lugar.