Considere este código:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
O GCC e o Clang rejeitam , porque o salto para bar:
ignora a inicialização da variável. O MSVC não reclama de nada (exceto usar x
after bar:
causa um aviso).
Podemos fazer uma coisa semelhante com um switch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Agora todos os três compiladores emitem erros .
Esses trechos estão mal formados? Ou eles causam UB?
Eu costumava pensar que ambos eram mal formados, mas não consigo encontrar as partes reveladoras do padrão. [stmt.goto] não diz nada sobre isso, nem [stmt.select] .
/permissive-
sinalizador ao MSVC e ele também irá reclamar. Não sei se o comportamento do MSVC sem esse sinalizador está bem definido (eu diria que sim, caso contrário, por que eles permitiriam?).
x
depois do salto.