2015-04-21 5 views
16

Wenn ich eine Funktion als noexcept(false) oder einen anderen Ausdruck, der als falsch auswertet, markieren, was bedeutet das? (1) Gewähre ich dem Compiler, dass die Funktion eine Ausnahme auslösen kann ?, (2) oder stelle ich sicher, dass keine Ausnahmen ausgelöst werden können oder nicht?C++ - Angabe von "noexcept" gegenüber "noexcept (false)", was ist ihre genaue Bedeutung?

Und schließlich, wenn ich die noexcept Spezifizierer weglassen, ist es gleichbedeutend mit noexcept(false), oder nur äquivalent zu der (2) nd Bedeutung oben angegeben?

+0

Wenn Sie 'noexcept (false)' als das Gegenteil von 'noexcept (true)' nehmen, beantwortet [eine Referenz] (http://en.cppreference.com/w/cpp/language/noexcept_spec) alles. – chris

Antwort

16

Durch Angabe von noexcept(true) behaupten Sie, dass die Funktion niemals Ausnahmen auslöst. Wenn Sie noexcept(false) angeben oder nichts angeben, behaupten Sie nicht, dass die Funktion niemals Ausnahmen auslöst.

Also ist es im Grunde Ihre Aussage (2), aber beachten Sie, dass für den Compiler, das entspricht Ihrer Aussage (1) ist. Wenn der Compiler nicht sicher ist, dass die Funktion nicht werfen wird, muss er davon ausgehen, dass dies möglich ist.

das entsprechende Bit des Standard ist C++ 11 15.4/12:

Eine Funktion ohne exception-Spezifikation oder mit einer exception-Spezifikation der Form, wo die noexcept(constant-expression)konstanten -ausdruck ergibt false erlaubt alle Ausnahmen. Ein exception-Spezifikation ist non werfenden wenn sie von der Form ist throw(), noexcept oder noexcept(constant-expression) wo die konstanter Ausdruck true Ausbeuten. Eine Funktion mit einer nicht-werfen Exception-Spezifikation lässt keine Ausnahmen zu.

Es gibt nur zwei Abweichungen von dieser Regel. One ist Destruktoren — Putting keine Ausnahmebestimmung auf einem Destruktor gibt der Destruktor die gleiche Ausnahme Spezifikation wie die Standard-generierte hätte. Das heißt, noexcept(true) wenn und nur wenn alle Funktionen, die direkt von dem standardmäßig generierten Destruktor aufgerufen werden würden, sind noexcept(true).

Die anderen sind Freigabe-Funktionen (operator delete) — eine Freigabe-Funktion ohne eine explizite Ausnahme-Spezifikation wird als noexcept(true) behandelt.

+1

@Deduplicator Die Formulierung in Bezug auf die Funktionen geändert, aber ich kann nicht scheinen, einen Verweis auf Konstruktoren zu finden, die sich gleich verhalten. Können Sie eine Absatznummer angeben? – Angew

+1

@Deduplicator Nur, wenn es nicht vom Benutzer bereitgestellt wird (d. H. Bei der ersten Deklaration implizit deklariert oder explizit als Standard deklariert). Siehe [dcl.fct.def.default]/p2, [except.spec]/14. –

+0

Sie haben auch Deallokationsfunktionen verpasst, die standardmäßig 'noexcept (true)' sind. –

8

Weglassen des noexcept Spezifizierer zu noexcept(false) äquivalent ist, außer bei Destruktoren, wobei das Weglassen der Spezifizierer bedeutet, lassen den Compiler aus den Mitgliedern und Basisklassen abgeleitet werden.