Domanda

Un saluto a tutti!

Esaminando il mio codice, sono arrivato fino a questa linea interessante:

const CString &refStr = ( CheckCondition() ) ? _T("foo") : _T("bar");

Ora sono completamente in perdita, e non riesco a capire il motivo per cui è legale. Per quanto ho capito, riferimento const deve essere inizializzato, sia con r-valore o l-value. riferimenti non inizializzate non possono esistere. Ma ()? operatore esegue una funzione CheckCondition () prima assegna valore al riferimento. Posso vedere ora, che, mentre viene eseguito CheckCondition (), refStr esiste, ma ancora non inizializzato. Che cosa accadrà se CheckCondition () un'eccezione, o passare il controllo con un goto? Lascerà il riferimento non inizializzato o mi sto perdendo qualcosa?

È stato utile?

Soluzione

esempio più semplice: const int x = foo();

Questa costante ha anche essere inizializzato, e per questo foo() deve essere chiamato. Questo accade in ordine necessario:. X viene in esistenza solo quando i rendimenti foo

Per rispondere alle vostre domande: Se foo() sarebbe throw, l'eccezione viene catturato da un catch() da qualche parte. Il blocco try{} per quella catch() circondato const int x = foo(); ovviamente. Quindi const int x è fuori del campo di applicazione già, ed è irrilevante che non ha mai avuto un valore. E se non c'è catch per l'eccezione, il vostro programma (tra cui const int x) è andato.

C ++ non ha casuali goto di. Essi possono saltare all'interno foo(), ma questo non ha importanza; foo() deve ancora tornare.

Altri suggerimenti

Ti manca qualcosa - è completamente codice legale, e in effetti tale codice è una delle più comuni e migliori utilizzi del operatore condizionale. E 'sempre un errore pensare che il compilatore deve internamente fare le cose nello stesso ordine che il codice è spiegate nella pagina - è perfettamente libero di valutare l'operatore condizionale (che è justv un'altra espressione) e quindi utilizzare il risultato per eseguire l'inizializzazione.

Come per un goto, non c'è modo di usare uno in un'inizializzazione. E se viene generata un'eccezione, è considerato il riferimento non essere stato creato in primo luogo.

  

non possono esistere riferimenti non inizializzate.

cose divertenti Purtroppo può essere fatto durante l'inizializzazione. Si potrebbe avere anche scritto

const int& a = foobar(a) ? 1 : 2;

o per la materia

const int& a = a;

Credo che con il procedere del compilatore da sinistra a destra, una è infatti portata sul lato destro, in modo tecnicamente si dovrebbe essere in grado di usarlo e nella migliore delle ipotesi si può mettere in guardia:

"ComeauTest.c", linea 9: avvertimento: variabile "a" viene utilizzato prima del suo valore è impostato

  const int& a = foobar(a) ? 1 : 2;
                        ^

Naturalmente ciò può comportare unicamente il comportamento non definito come con l'utilizzo di qualsiasi variabile non inizializzata.

Il vostro esempio va bene, dal momento che non si utilizza il riferimento prima che è stato inizializzato.

  

posso vedere ora, che, mentre viene eseguito CheckCondition (), refStr esiste, ma ancora non inizializzato.

Da un punto di vista legale la lingua, questo è sbagliato. Durante l'inizializzazione, refStr non esiste ancora. Direi che il debugger di Visual ti dà consigli fuorvianti.

Se il codice all'interno l'inizializzazione porta ad una condizione di errore, refStr non esisterà, e non potrà mai esistere.

Questo è completamente legale. O questo termina con successo e il riferimento è associato a un oggetto valido o viene generata un'eccezione e controllo è trasferito al di fuori del blocco e il riferimento non è portata così nessuno si preoccupa di più.

Un'eccezione vi porterà in un posto dove refStr non è accessibile e non si può andare in un posto dove è da lì. Un goto non sarà in grado di uscire da CheckCondition () se si tratta di una funzione, e non sarà in grado di utilizzare un goto se si tratta di una macro. A longjmp () avrà lo stesso effetto come eccezione:. Andrai in un posto dove non è accessibile refStr

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top