In welchen Fällen leitet ein C ++ - Compiler keine Ausnahme ab?

9

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.

    
einpoklum 13.11.2017, 14:03
quelle

1 Antwort

4

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 .

Konstruktoren

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

Destruktoren

Ist implizit noexcept , es sei denn, ein Destruktor für ein potentiell konstruiertes Unterobjekt wirft potenziell.

Zuweisungsoperatoren

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.

    
AndyG 13.11.2017 14:20
quelle