2016-04-20 12 views
6

Mój szef odpowiedział na to pytanie why ... (three points) in catch block is exist? dość elegancko.Czy rzut w połowie (...) rzucać przez wartość lub przez odniesienie

Ale to mnie myśleć o czymś (i miejmy nadzieję nadrabia moim poprzednim złe pytanie), czy

catch(...){ 
    throw; 
} 

rethrow złowione wyjątku przez wartości (tj głęboka kopia zostanie podjęta), albo przez odniesienie?

+3

_Odwrotny obiekt wyjątku jest oryginalnym obiektem wyjątku, a nie kopią._ Zrobione z uwag w instrukcjach [wypróbuj, throw i catch] (https://msdn.microsoft.com/en-GB/library/ 6dekhbbc.aspx). Opierając się na tym, zakładam przez odniesienie? –

+0

Możliwy duplikat [wykonaj domyślne instrukcje rzutu catch w C++, podaj wartość lub referencję] (http://stackoverflow.com/questions/9562053/do-the-default-catch-throw-statements-in-c-pass- wartość-pod-wartości lub odniesienie) –

Odpowiedz

9

Norma mówi:

Rzut ekspresja bez argumentu ponownie generuje aktualnie obsługiwany wyjątek. Wyjątek jest reaktywowany z istniejącym tymczasowym; nie utworzono nowego tymczasowego obiektu wyjątku.

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

Innymi słowy, po prostu kontynuuje propagację wyjątku z oryginalnym obiektem wyjątku. Przypuszczam, że jest to analogiczne do tego, co masz na myśli przez "odniesienie".

+1

Lokalizacja uległa zmianie w późniejszych wersjach §5.17/3, ale pozostało sformułowanie i zamiar; [patrz tutaj link] (http://eel.is/c++draft/expr.throw#3). I ten cytat * "Jeśli program obsługi kończy działanie przez ponowne wyrzucanie, kontrola jest przekazywana do innego programu obsługi z tego samego wyjątku." * Od [tutaj] (http://eel.is/c++draft/except#except.throw-4). – Niall

Powiązane problemy