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.
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