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