Considérez ce code:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC et Clang le rejettent , car le saut pour bar:
contourne l'initialisation des variables. MSVC ne se plaint pas du tout (sauf si l'utilisation x
après bar:
provoque un avertissement).
Nous pouvons faire une chose similaire avec switch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Désormais, les trois compilateurs émettent des erreurs .
Ces extraits sont-ils mal formés? Ou causent-ils de l'UB?
Je pensais que les deux étaient mal formés, mais je ne trouve pas les parties révélatrices de la norme. [stmt.goto] ne dit rien à ce sujet, pas plus que [stmt.select] .
/permissive-
drapeau à MSVC et il se plaindra également. Je ne sais pas si le comportement de MSVC sans cet indicateur est bien défini (je suppose que oui, sinon pourquoi le permettrait-il?).
x
après le saut.