Namespaces
Variants

C++ attribute: noreturn (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Gibt an, dass die Funktion nicht zurückkehrt.

Inhaltsverzeichnis

Syntax

[ [ noreturn ] ]

Erklärung

Gibt an, dass die Funktion nach Beendigung nicht zur aufrufenden Funktion zurückkehrt (z.B. Funktionen, die die Anwendung beenden, Ausnahmen werfen, endlos schleifen, etc.). Dieses Attribut gilt nur für den Namen der Funktion, die in Funktionsdeklarationen deklariert wird.

Wenn eine Funktion, die zuvor mit [ [ noreturn ] ] deklariert wurde, aufgerufen wird und dieser Aufruf schließlich zurückkehrt, ist das Verhalten Laufzeit-undefiniert .

Die erste Deklaration der Funktion muss dieses Attribut angeben, falls es in irgendeiner Deklaration angegeben wird. 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.

Beispiel

[[noreturn]] void f()
{
    throw "error";
    // OK
}
void q [[noreturn]] (int i)
{
    // Verhalten ist undefiniert, wenn mit einem Argument <= 0 aufgerufen
    if (i > 0)
        throw "positive";
}
// void h() [[noreturn]]; // Fehler: Attribut auf Funktionstyp von h angewendet, nicht auf h selbst
int main()
{
    try { f(); } catch(...) {}
    try { q(42); } catch(...) {}
}

Standardbibliothek

Die folgenden Standardfunktionen sind mit dem noreturn -Attribut deklariert:

Beendigende Funktionen
(C++11)
bewirkt normale Programmbeendigung ohne Bereinigung
(Funktion)
bewirkt abnormale Programmbeendigung (ohne Bereinigung)
(Funktion)
bewirkt normale Programmbeendigung mit Bereinigung
(Funktion)
(C++11)
bewirkt schnelle Programmbeendigung ohne vollständige Bereinigung
(Funktion)
Funktion, die bei Fehlschlagen der Ausnahmebehandlung aufgerufen wird
(Funktion)
(veraltet in C++11) (entfernt in C++17)
Funktion, die bei Verletzung der dynamischen Ausnahmespezifikation aufgerufen wird
(Funktion)
Compiler-Hinweise
markiert unerreichbaren Punkt der Ausführung
(Funktion)
Immer-werfende Funktionen
wirft die Ausnahme von einem std::exception_ptr
(Funktion)
wirft die gespeicherte Ausnahme
(öffentliche Elementfunktion von std::nested_exception )
wirft sein Argument mit std::nested_exception vermischt
(Funktionstemplate)
Nicht-lokale Sprünge (seit C++17)
springt zu angegebener Position
(Funktion)

Fehlerberichte

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

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 2924 C++11 Rückkehr aus einer [ [ noreturn ] ] Funktion
würde zu undefiniertem Verhalten führen
führt zu Laufzeit-
undefiniertem Verhalten

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]

Siehe auch

C-Dokumentation für _Noreturn
C-Dokumentation für [[noreturn]]