2016-04-20 14 views
6

Il mio capo ha risposto a questa domanda why ... (three points) in catch block is exist? in modo piuttosto elegante.Il lancio ha luogo (...) per valore o per riferimento

Ma mi ha fatto pensare a qualcosa (e, si spera compensa la mia precedente domanda cattiva), fa

catch(...){ 
    throw; 
} 

rethrow eccezione catturato da valore (vale a dire una copia profonda è preso), oppure riferimento?

+3

_L'oggetto eccezione ri-generata è l'oggetto eccezione originale, non una copia._ Tratto dalle Note in [provare, lanciare e prendere dichiarazioni] (https://msdn.microsoft.com/en-GB/library/ 6dekhbbc.aspx). Quindi, sulla base di ciò, presumo per riferimento? –

+0

Possibile duplicato di [eseguire le istruzioni di cattura catch predefinite in C++ passare per valore o riferimento] (http://stackoverflow.com/questions/9562053/do-the-default-catch-throw-statements-in-c-pass- per valore o riferimento) –

risposta

9

Lo standard dice:

una rimessa espressione senza operando genera nuovamente l'eccezione attualmente gestita. L'eccezione si riattiva con il provvisorio esistente; non viene creato alcun nuovo oggetto di eccezione temporaneo.

- ISO/IEC 14882: 2011 Sezione 15.1 par. 8

In altre parole, continua semplicemente la propagazione dell'eccezione con l'oggetto di eccezione originale. Suppongo che sia analogo a ciò che intendi per "per riferimento".

+1

La posizione è cambiata in successive bozze §5.17/3, ma la formulazione e l'intento rimangono; [vedi qui per un link] (http://eel.is/c++draft/expr.throw#3). E questa citazione * "Se un gestore esce da rilanciando, il controllo viene passato a un altro gestore per la stessa eccezione." * Da [qui] (http://eel.is/c++draft/except#except.throw-4). – Niall

Problemi correlati