Considera questo codice:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC e Clang lo rifiutano , perché il salto per bar:
bypassare l'inizializzazione variabile. MSVC non si lamenta affatto (tranne l'uso di x
after bar:
provoca un avviso).
Possiamo fare una cosa simile con un switch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Ora tutti e tre i compilatori emettono errori .
Quei frammenti sono mal formati? O causano UB?
Pensavo che entrambi fossero mal formati, ma non riesco a trovare le parti rivelatrici dello standard. [stmt.goto] non dice nulla al riguardo, e nemmeno [stmt.select] .
/permissive-
flag a MSVC e si lamenterà anche. Non so se il comportamento di MSVC senza quella bandiera sia ben definito (lo presumo, altrimenti perché lo permetterebbero?).
x
dopo il salto.