Für den folgenden Code
%Vor%Visual Studio 14 CTP gibt die Warnung aus
Warnung C4297: 'X :: X': Funktion angenommen, keine Ausnahme zu werfen, aber tut
Hinweis: __declspec (nothrow), throw (), noexcept (true) oder noexcept war spezifiziert auf der Funktion
Ist das ein Missbrauch von noexcept
? Oder ist es ein Fehler im Microsoft Compiler?
Oder ist es ein Fehler im Microsoft Compiler?
Nicht ganz.
Ein so genannter Function-try-Block wie dieser kann nicht verhindern, dass eine Ausnahme nach draußen gelangt. Beachten Sie, dass das Objekt niemals vollständig erstellt wird, da der Konstruktor die Ausführung nicht beenden kann. Der catch
-Block muss etwas anderes werfen oder die aktuelle Ausnahme wird erneut ausgelöst ([except.handle] / 15):
Die aktuell behandelte Ausnahme wird erneut ausgelöst, wenn die Steuerung das Ende erreicht eines Handlers des function-try-block eines Konstruktors oder Destruktor.
Daraus leitet der Compiler ab, dass der Konstruktor tatsächlich werfen kann.
%Vor%Sollte ohne Warnung kompiliert werden.
Tags und Links c++ c++11 visual-c++ noexcept c++14