Angenommen, ein C ++ - Compiler kompiliert eine Funktion, deren Definition in derselben Übersetzungseinheit wie ihr Aufruf verfügbar ist. Nehmen wir an, dass es sich nicht selbst wirft oder eine Funktion aufruft, von der es weiß, dass sie geworfen werden kann. Angenommen, es wird auch kein extern C
-Code aufgerufen, und auch keine numerische Division mit einem Wert von potenziell Null.
Unter diesen Annahmen behandelt der Compiler die Funktion als noexcept
? Wenn nicht, gibt es zusätzliche Bedingungen, unter denen noexcept
abgeleitet wird?
Genauer gesagt, was ist mit super-einfachen Funktionen wie
? %Vor%?
Ich hätte gerne eine Antwort, die nur auf dem Standard basiert, und möglicherweise auch auf dem, was GCC und Clang tun.
Es wird davon ausgegangen, dass fast alle Funktionen potenziell geworfen werden, es sei denn, Sie verwenden explizit einen noexcept
-Spezifikator. Die Ausnahmen sind für Ihre eigenen Definitionen von delete
(Freigabe-Funktionen) und einige spezielle Member-Funktionen: Konstruktoren, Destruktoren und Zuweisungsoperatoren. (C ++ 17)
Aus [except.spec]
Wenn eine Deklaration einer Funktion keinen noexcept-specifier hat, wirft die Deklaration möglicherweise einen Fehler auf Ausnahmespezifikation, es sei denn, es handelt sich um eine Destruktor- oder Deallokationsfunktion oder wird bei der ersten Deklaration In diesen Fällen gilt die Ausnahmebestimmung wie unten angegeben und keine andere Erklärung für diese Funktion habe einen noexcept-specifier .
Ist implizit noexcept
, es sei denn, eine Initialisierung, die für ein Mitglied (oder das Mitglied eines Mitglieds usw.) durchgeführt wird, wirft möglicherweise
Ist implizit noexcept
, es sei denn, ein Destruktor für ein potentiell konstruiertes Unterobjekt wirft potenziell.
Sind implizit noexcept
, es sei denn, die Verwendung von Zuweisungen innerhalb von potentiell-werfend ist.
Hier ist ein Beispielcode, der das obige Beispiel veranschaulicht ( clang 6.0.0 , gcc 8.0.0 ):
%Vor% Ein weiterer Grund, =default
zu verwenden oder dem Compiler zu erlauben, eigene Versionen seiner speziellen Member-Funktionen durch Auslassung zu erzeugen.
Tags und Links c++ exception compiler-optimization noexcept