2016-04-20 8 views
4

Aus dieser Antwort https://stackoverflow.com/a/36738405/4523099:Wurf Ausnahme von Wert oder Referenz

Ein Wurf-Ausdruck ohne Operanden rethrows die derzeit Ausnahme behandelt. Die Ausnahme wird mit dem vorhandenen temporären reaktiviert; kein neues temporäres Ausnahmeobjekt erstellt. - ISO/IEC 14882: 2011 Abschnitt 15.1 Par. 8

Warum also bekomme ich dieses Ergebnis von diesem Code?

Code:

#include <iostream> 

class my_exception: public std::exception{ 
public: 
    int value; 
}; 
int main() 
{ 
    my_exception ex; 
    ex.value=1; 
    try{ 
     throw ex; 
    } 
    catch(my_exception& e){ 
     e.value=2; 
    } 
    std::cout << ex.value; 
    return 0; 
} 

Tatsächliches Ergebnis:

ich dachte, es sollte 2 je nach Standard-Quote. Was vermisse ich?

+2

* "Ein Wurf-Ausdruck ohne Operanden" * ist ein 'werfen;' (in catch-Block). – Jarod42

Antwort

7

Dies ist beacuse throw (die normale Version) wird make a copy:

Kopieren Sie zunächst initialisiert das Ausnahmeobjekt aus dem Ausdruck (dies den Umzug Konstruktor für rvalue Ausdruck nennen können, und das Kopieren/Verschieben sein kann zu kopieren elision), ...

und behalten Sie es intern, so ändert e.value=2; interne Kopie.

In der SO erwähnte Frage war über die Re-Throw-Version, die keine neue Kopie erstellt, sondern die bereits vorhandene interne Kopie verwendet.

2

Es ist nur der Re-throw (ohne Operand), der dasselbe Ausnahmeobjekt erneut verwendet. Hier einige Code, demonstrieren:

#include <iostream> 

class my_exception: public std::exception{ 
public: 
    int value; 
}; 

void f(my_exception& ex) { 
    ex.value = 1; 
    try { 
     throw ex; 
    } catch (my_exception& e) { 
     e.value = 2; 
     // Here's the re-throw 
     throw; 
    } 
} 

int main() 
{ 
    my_exception ex; 
    try { 
     f(ex); 
    } catch (my_exception& e) { 
     std::cout << e.value; 
    } 
    return 0; 
} 
Verwandte Themen