Quando sto leggendo lo standard C++, sembra che il seguente codice sia perfettamente a posto secondo lo standard.Perché è OK passare all'ambito di un oggetto di tipo scalare senza un inizializzatore?
int main() {
goto lol;
{
int x;
lol:
cout << x << endl;
}
}
// OK
[n3290: 6,7/3]: è possibile trasferire in un blocco, ma non in modo che aggira le dichiarazioni con l'inizializzazione. Un programma che salta da un punto in cui una variabile con durata di memorizzazione automatica è non portata a un punto in cui è portata è mal formata meno che la variabile ha scalari tipo, tipo di classe con un banale predefinito costruttore e un distruttore banale, una versione cv-qualificata di uno dei tipi o un array di uno dei tipi precedenti ed è dichiarato senza un inizializzatore.
Perché dovrebbe funzionare? Non è ancora pericoloso saltare oltre la sua definizione e usare un indefinito x
? E perché l'esistenza di un inizializzatore dovrebbe fare la differenza?
Ma il problema è che, indipendentemente da un inizializzatore, x non è definito perché la sua definizione viene comunque ignorata. Non è vero? –
@EricZ: la definizione si verifica ancora. 'goto' è una cosa runtime, salta solo il comportamento di runtime, come l'inizializzazione. – GManNickG
@GMan, giusto! Grazie;) –