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] .
c++
language-lawyer
goto
initializer
variable-declaration
HolyBlackCat
fuente
fuente
x
despué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
x
se aplicarían las advertencias habituales sobre el uso con un valor indeterminado.fuente
De la declaración goto :
fuente