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 x
despué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] .
/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?).
x
después del salto.