Namensräume
Varianten
Aktionen

noexcept Operator (seit C++11)

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 
Ausnahmen
try Block
Ausnahmen auslösen
Ausnahmen behandeln
Ausnahmespezifikation
    noexcept Spezifikation (C++11)
    dynamische Spezifikation (bis C++17*)
noexcept Operator (C++11)
 

Der noexcept Operator führt eine Prüfung zur Kompilierzeit durch, die true zurückgibt, wenn ein Ausdruck so deklariert ist, dass er keine Exceptions wirft.

Er kann innerhalb eines Funktions-Templates noexcept Spezifizierer verwendet werden, um zu deklarieren, dass die Funktion für einige Typen Exceptions wirft, für andere jedoch nicht.

Inhalt

[edit] Syntax

noexcept( Ausdruck )

Gibt ein prvalue vom Typ bool zurück. Das Ergebnis ist true, wenn die Menge der potenziellen Exceptions des Ausdrucks leer ist(bis C++17)Ausdruck als nicht werfend spezifiziert ist(seit C++17), und andernfalls false.

Ausdruck ist ein nicht ausgewerteter Operand.

Wenn Ausdruck ein prvalue ist, wird die temporäre Materialisierung angewendet.

(seit C++17)

[edit] Anmerkungen

Selbst wenn noexcept(expr) true ist, kann eine Auswertung von expr aufgrund von undefiniertem Verhalten immer noch eine Exception werfen.

Wenn Ausdruck vom Typ einer Klasse oder eines (möglicherweise mehrdimensionalen) Arrays davon ist, erfordert die temporäre Materialisierung, dass der Destruktor nicht gelöscht und zugänglich ist.

(seit C++17)

[edit] Schlüsselwörter

noexcept

[edit] Beispiel

#include <iostream>
#include <utility>
#include <vector>
 
void may_throw();
void no_throw() noexcept;
auto lmay_throw = []{};
auto lno_throw = []() noexcept {};
 
class T
{
public:
    ~T(){} // dtor prevents move ctor
           // copy ctor is noexcept
};
 
class U
{
public:
    ~U(){} // dtor prevents move ctor
           // copy ctor is noexcept(false)
    std::vector<int> v;
};
 
class V
{
public:
    std::vector<int> v;
};
 
int main()
{
    T t;
    U u;
    V v;
 
    std::cout << std::boolalpha <<
        "may_throw() is noexcept(" << noexcept(may_throw()) << ")\n"
        "no_throw() is noexcept(" << noexcept(no_throw()) << ")\n"
        "lmay_throw() is noexcept(" << noexcept(lmay_throw()) << ")\n"
        "lno_throw() is noexcept(" << noexcept(lno_throw()) << ")\n"
        "~T() is noexcept(" << noexcept(std::declval<T>().~T()) << ")\n"
        // note: the following tests also require that ~T() is noexcept because
        // the expression within noexcept constructs and destroys a temporary
        "T(rvalue T) is noexcept(" << noexcept(T(std::declval<T>())) << ")\n"
        "T(lvalue T) is noexcept(" << noexcept(T(t)) << ")\n"
        "U(rvalue U) is noexcept(" << noexcept(U(std::declval<U>())) << ")\n"
        "U(lvalue U) is noexcept(" << noexcept(U(u)) << ")\n"
        "V(rvalue V) is noexcept(" << noexcept(V(std::declval<V>())) << ")\n"
        "V(lvalue V) is noexcept(" << noexcept(V(v)) << ")\n";
}

Ausgabe

may_throw() is noexcept(false)
no_throw() is noexcept(true)
lmay_throw() is noexcept(false)
lno_throw() is noexcept(true)
~T() is noexcept(true)
T(rvalue T) is noexcept(true)
T(lvalue T) is noexcept(true)
U(rvalue U) is noexcept(false)
U(lvalue U) is noexcept(false)
V(rvalue V) is noexcept(true)
V(lvalue V) is noexcept(false)

[edit] Defect reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
CWG 2722 C++17 es war unklar, ob temporäre Materialisierung
angewendet wird, wenn Ausdruck ein prvalue ist
sie wird angewendet
in diesem Fall
CWG 2792 C++11 der noexcept Operator war erforderlich, um zu bestimmen, ob Exceptions
im Falle von undefiniertem Verhalten geworfen werden können
nicht erforderlich.

[edit] Siehe auch

noexcept Spezifizierer(C++11) spezifiziert, ob eine Funktion Exceptions werfen kann[edit]
Dynamische Exception-Spezifikation(bis C++17) spezifiziert, welche Exceptions von einer Funktion geworfen werden (veraltet in C++11) [edit]