2010-10-28 16 views
5

Consente di considerare Ho la seguente funzione:affettazioni ed eccezioni

SomeType createSomeType(); 

che può throw seconda di alcuni motivi.

Poi:

SomeType val = SomeType(); // initial value 

try 
{ 
    val = createSomeType(); // here 
} 
catch (std::exception&) 
{ 
} 

Se createSomeType() tiri liberi, posso sempre per scontato che val valore è invariato ?

risposta

7

Sì, se createSomeType() genera un'eccezione, l'assegnazione non avverrà. Il flusso del controllo passerà dall'istruzione throw, attraverso i distruttori di tutti gli oggetti createSomeType() in pila e infine alla dichiarazione catch.

1

Se l'operatore di assegnazione per SomeType è protetto da eccezioni, si può essere sicuri che a val verrà assegnato un nuovo valore coerente o il suo valore iniziale rimarrà invariato.

Tuttavia, l'eccezione può essere generata da createSomeType() o dall'assegnazione dopo che è stato eseguito correttamente createSomeType(). Se l'operatore di assegnazione per SomeType è sovraccarico e può generare eccezioni, potrebbe accadere che val finisca nello stato incoerente "semi assegnato". Quest'ultimo è il risultato di non adottare la sicurezza delle eccezioni nel design SomeType che è negativo ma che può ancora succedere.

+4

Se 'createSomeType' getta, sarà il corpo dell'operatore di assegnazione mai essere inserito? Come potrebbe cambiare il valore in quel caso? –

+0

@ Space_C0wb0y: Potrebbe accadere che il corpo non getti, ma l'incarico sovraccarico getta. – sharptooth

+1

L'OP chiede esplicitamente il caso in cui 'createSomeType' genera, quindi l'operatore di assegnazione non svolge alcun ruolo (in quello specifico scenario). –

0

Da documenti standard 15.2.1,

Come controllo passa da una rimessa espressione a un gestore, distruttori vengono richiamati per tutti gli oggetti automatici costruiti dal momento che il blocco try è stato inserito. Gli oggetti automatici vengono distrutti nell'ordine inverso rispetto al completamento della loro costruzione .

Di qui il valore val, non cambierà ...