noexcept(false) bei Destruktoren



  • Hallo Forum,

    soweit ich es verstanden habe, sind Destruktoren ja mit C++11 standardmäßig implizit mit noexcept deklariert.
    Sollte ein Destruktor doch werfen müssen, kann er mit noexcept(false) deklariert werden. Was ich in diesem Zusammenhang nicht verstehe, ist folgendes.

    class Base
    {
    public:
       Base() {}
       virtual ~Base() {}
    };
    
    class Derived : public Base
    {
    public:
       Derived() {}
       ~Derived()  noexcept(false)
       {
          throw std::exception("exc");
       }
    };
    

    Wenn ich in einer abgeleiteten Klasse eine weniger restriktive Exception-Spezifikation verwende als in der Basisklasse, beschwert sich der Compiler (Visual Studio 2015):
    error C2694: 'Derived::~Derived(void) noexcept(false)': overriding virtual function has less restrictive exception specification than base class virtual member function 'Base::~Base(void)'

    Mir ist nicht klar, warum das ein Problem ist. Und auch nicht wie man damit umgeht. Wenn der Destruktor einer abgeleiteten Klasse doch mal werfen muss, ist es dann tatsächlich erforderlich entweder die Basisklasse ebenfalls azupassen oder nicht von ihr abzuleiten...?

    Für ein wenig Erhellung wäre ich dankbar.



  • Da ist doch ziemlich deutlich das Substitutionsprinzip verletzt, oder?

    D.h. wenn ich bisher ein Programm hatte, das mit Base funktioniert hat, tut es das nicht mehr, nachdem ich Base durch Derived ersetze.



  • Danke für die schnelle Antwort!

    Ein wenig klarer ist mir das inzwischen geworden.
    Würde ich in einer Funktion Basisklassen-Instanzen verwenden, könnte die Funktion meinem Beispiel (ggf.) entsprechend ebenfalls noexcept sein. Wenn ich hingegen Instanzen der abgeleiteten Klasse verwenden würde, könnte sie das nicht mehr.


Anmelden zum Antworten