2016-07-22 3 views
2

Angesichts des Beispiels über std::exception_ptr von cpprefernce.com, wäre es legal, den Code in der folgenden Weise zu verkürzen? Wenn die gesamte Verarbeitung innerhalb des Catch-Blocks erfolgt, sollte die std::exception_ptr weder außen noch global gespeichert werden.Lebensdaueranforderungen für die Speicherung von std :: exception_ptr

#include <iostream> 
#include <string> 
#include <exception> 
#include <stdexcept> 

void handle_eptr(std::exception_ptr eptr) // passing by value is ok 
{ 
    try { 
     if (eptr) { 
      std::rethrow_exception(eptr); 
     } 
    } catch(const std::exception& e) { 
     std::cout << "Caught exception \"" << e.what() << "\"\n"; 
    } 
} 

int main() 
{ 
    try { 
     std::string().at(1); // this generates an std::out_of_range 
    } catch(...) { 
     handle_eptr(std::current_exception()); // CHANGE: HANDLING THE std::exception_ptr AS R-VALUE INSIDE THE CATCH BLOCK 
    } 
} // destructor for std::out_of_range called here, when the eptr is destructed 

Antwort

3

ja, das Programm ist gültig.

von cppreference:

das Ausnahmeobjekt durch eine std :: exception_ptr referenzierten bleibt gültig solange es mindestens eine std :: exception_ptr bleibt, dass verweist es: std :: exception_ptr a ist Shared-Ownership Smart-Pointer

in diesem Fall eptr wird sicherstellen, dass der Wert von std::current_exception zurückgegeben wird nicht außerhalb des Bereichs erhalten. wenn im Zweifel denken, dass die Lebensdauer von std::exception_ptr die gleichen Scoping-Regeln von std::shared_ptr folgt, da sie beide „Shared-Ownership Smart Pointer“

1

Sicher, aber die Spitze des cppreference Code ist, dass die Ausnahme Zeiger können Sie anhalten die Lebensdauer der Ausnahme außerhalb des Catch-Blocks und ohne erneutes Auslösen.

So sieht Ihr Code legal aus, aber es würde den Zweck nicht erfüllen, den der cppreference Code tut.

+0

Vielleicht ist mein Zweck etwas anders. Ich bin schon froh darüber, einen vollwertigen Ausnahme-Handler auslagern zu können (weniger Code-Duplizierung), der verschiedene Ausnahmen einschließlich Protokollierungsfunktionen behandelt. Daher brauche ich keine lebenslange Erweiterung. – Simon1X

Verwandte Themen