Considera este código:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC y Clang lo rechazan porque el salto a bar:omite la inicialización variable. MSVC no se queja en absoluto (excepto que usar xdespués bar:causa una advertencia).
Podemos hacer algo similar con un switch:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Ahora los tres compiladores emiten errores .
¿Están esos fragmentos mal formados? ¿O causan UB?
Solía pensar que ambos estaban mal formados, pero no puedo encontrar las partes reveladoras del estándar. [stmt.goto] no dice nada al respecto, y tampoco [stmt.select] .
c++
language-lawyer
goto
initializer
variable-declaration
HolyBlackCat
fuente
fuente

xdespués del salto./permissive-bandera a MSVC y también se quejará. Sin embargo, no sé si el comportamiento de MSVC sin ese indicador está bien definido (supongo que sí, de lo contrario, ¿por qué lo permitirían?).Respuestas:
Está mal formado cuando la inicialización no es vacía.
El inicializador hace que la inicialización no sea vacía. Por el contrario, esto
Estaría bien formado. Aunque
xse aplicarían las advertencias habituales sobre el uso con un valor indeterminado.fuente
De la declaración goto :
fuente