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 xafter 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?).
xdopo il salto.