noexcept (C++)

C++11: Gibt an, ob eine Funktion Ausnahmen auslösen kann.

Syntax

noexcept-specifier:
noexcept
noexcept-expression
throw ( )
noexcept-expression:
noexcept ( constant-expression )

Parameter

constant-expression
Ein konstanter Ausdruck vom Typ bool , der angibt, ob der Satz potenzieller Ausnahmetypen leer ist. Die bedingungslose Version entspricht noexcept(true).

Hinweise

A noexcept-expression ist eine Art von Ausnahmespezifikation: ein Suffix einer Funktionsdeklaration, die einen Satz von Typen darstellt, die von einem Ausnahmehandler für jede Ausnahme abgeglichen werden können, die eine Funktion beendet. Unary conditional operator noexcept(constant_expression) when constant_expression yields true, and its conditional synonym noexcept, specify that the set of potential exception types that can exit a function is empty. Das heißt, die Funktion löst niemals eine Ausnahme aus und erlaubt nie, dass eine Ausnahme außerhalb des Bereichs verteilt wird. Der Operator noexcept(constant_expression) , wenn constant_expression eine Ausnahmespezifikation (außer für eine Destruktor- oder Deallocation-Funktion) zurückgegeben falsewird, gibt an, dass der Satz potenzieller Ausnahmen, die die Funktion beenden können, die Gruppe aller Typen ist.

Markieren Sie eine Funktion als noexcept nur, wenn alle von ihr aufgerufenen Funktionen entweder direkt oder indirekt ebenfalls noexcept oder indirekt sind.const Der Compiler überprüft nicht unbedingt jeden Codepfad auf Ausnahmen, die bis zu einer noexcept Funktion bubieren können. Wenn eine Ausnahme den äußeren Bereich einer funktion beendet, die markiert noexceptist, std::terminate sofort aufgerufen wird und keine Garantie dafür besteht, dass Destruktoren von Objekten im Gültigkeitsbereich aufgerufen werden. Verwenden Sie noexcept anstelle des dynamischen Ausnahmebezeichners throw(). Die dynamische Ausnahmespezifikation oder throw(optional_type_list) -spezifikation wurde in C++11 veraltet und in C++17 entfernt, mit Ausnahme von throw(), die ein Alias für noexcept(true). Es wird empfohlen, dass Sie auf jede Funktion anwenden noexcept , die niemals eine Ausnahme zum Verteilen des Aufrufstapels zulässt. Wenn eine Funktion deklariert noexceptwird, kann der Compiler effizienteren Code in mehreren verschiedenen Kontexten generieren. Weitere Informationen finden Sie unter Ausnahmespezifikationen.

Beispiel

Eine Funktionsvorlage, die das Argument kopiert, kann für die Bedingung deklariert noexcept werden, dass das kopierte Objekt ein einfacher alter Datentyp (POD) ist. Eine solche Funktion kann wie folgt deklariert werden:

#include <type_traits>

template <typename T>
T copy_object(const T& obj) noexcept(std::is_pod<T>)
{
   // ...
}

Siehe auch

Bewährte Methoden für moderne C++-Methoden für Ausnahmen und Fehlerbehandlung
Ausnahmespezifikationen (throw, noexcept)