noexcept Operator (seit 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
[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 |
| Dynamische Exception-Spezifikation(bis C++17) | spezifiziert, welche Exceptions von einer Funktion geworfen werden (veraltet in C++11) |