C++ Attribut: noreturn (seit C++11)
Gibt an, dass die Funktion nicht zurückkehrt.
Inhalt |
[bearbeiten] Syntax
[[noreturn]]
|
|||||||||
[bearbeiten] Erklärung
Gibt an, dass die Funktion nach Abschluss die Kontrolle nicht an die aufrufende Funktion zurückgibt (z. B. Funktionen, die die Anwendung beenden, Ausnahmen auslösen, unendlich schleifen usw.). Dieses Attribut gilt nur für den Namen der Funktion, die in Funktionsdeklarationen deklariert wird.
Wenn eine zuvor mit [[noreturn]] deklarierte Funktion aufgerufen wird und dieser Aufruf schließlich zurückkehrt, ist das Verhalten Laufzeit-undefiniert.
Die erste Deklaration der Funktion muss dieses Attribut angeben, wenn irgendeine Deklaration es angibt. Wenn eine Funktion in einer Übersetzungseinheit mit [[noreturn]] deklariert wird und dieselbe Funktion in einer anderen Übersetzungseinheit ohne [[noreturn]] deklariert wird, ist das Programm fehlerhaft; keine Diagnose erforderlich.
[bearbeiten] Beispiel
[[noreturn]] void f() { throw "error"; // OK } void q [[noreturn]] (int i) { // behavior is undefined if called with an argument <= 0 if (i > 0) throw "positive"; } // void h() [[noreturn]]; // error: attribute applied to function type of h, not h itself int main() { try { f(); } catch(...) {} try { q(42); } catch(...) {} }
[bearbeiten] Standardbibliothek
Die folgenden Standardfunktionen sind mit dem Attribut noreturn deklariert.
Terminierende Funktionen | |
| (C++11) |
verursacht normalen Programmabbruch ohne Bereinigung (funktion) |
| verursacht abnormalen Programmabbruch (ohne Bereinigung) (funktion) | |
| verursacht normalen Programmabbruch mit Bereinigung (funktion) | |
| (C++11) |
verursacht schnellen Programmabbruch ohne vollständige Bereinigung (funktion) |
| Funktion, die aufgerufen wird, wenn die Ausnahmebehandlung fehlschlägt (Funktion) | |
| (in C++11 veraltet)(in C++17 entfernt) |
Funktion, die aufgerufen wird, wenn eine dynamische Ausnahmespezifikation verletzt wird (Funktion) |
Compiler-Hinweise | |
| (C++23) |
markiert einen unerreichbaren Ausführungspunkt (funktion) |
Immer werfende Funktionen | |
| (C++11) |
wirft die Ausnahme aus einem std::exception_ptr (Funktion) |
| wirft die gespeicherte Ausnahme (public member function von std::nested_exception)
| |
| (C++11) |
wirft ihr Argument mit std::nested_exception gemischt (Funktionstemplate) |
Nicht-lokale Sprünge (seit C++17) | |
| springt zur angegebenen Position (funktion) | |
[bearbeiten] Fehlerberichte
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 2924 | C++11 | Rückkehr aus einer [[noreturn]] Funktion würde zu undefiniertem Verhalten führen |
führt zu Laufzeit- undefiniertem Verhalten |
[bearbeiten] Referenzen
- C++23 Standard (ISO/IEC 14882:2024)
- 9.12.10 Noreturn-Attribut [dcl.attr.noreturn]
- C++20 Standard (ISO/IEC 14882:2020)
- 9.12.9 Noreturn-Attribut [dcl.attr.noreturn]
- C++17 Standard (ISO/IEC 14882:2017)
- 10.6.8 Noreturn-Attribut [dcl.attr.noreturn]
- C++14 Standard (ISO/IEC 14882:2014)
- 7.6.3 Noreturn-Attribut [dcl.attr.noreturn]
- C++11 Standard (ISO/IEC 14882:2011)
- 7.6.3 Noreturn-Attribut [dcl.attr.noreturn]
[bearbeiten] Siehe auch
| C-Dokumentation für _Noreturn
| |
| C-Dokumentation für
[[noreturn]] |