Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Funktion kann als 'noexcept' deklariert werden.
C++ Core Guidelines F.6: Wenn Ihre Funktion nicht ausgelöst werden darf, deklarieren Sie sie noexcept
Wenn Code keine Ausnahmen verursachen soll, sollte er mithilfe des noexcept Bezeichners markiert werden. Diese Anmerkung trägt zur Vereinfachung der Fehlerbehandlung auf clientcodeseitiger Seite bei und ermöglicht es dem Compiler, weitere Optimierungen zu erledigen.
Hinweise
- Eine Funktion gilt als nicht auslösend, wenn:
- sie hat keine ausdrücklichen
throwAussagen; - Funktionsaufrufe im Textkörper rufen, falls vorhanden, nur Funktionen auf, die nicht ausgelöst werden können:
constexproder Funktionen, die mit Ausnahmespezifikationen gekennzeichnet sind, die ein nicht auslösendes Verhalten (einschließlich einiger nicht standardmäßiger Spezifikationen) mit sich bringen.
- sie hat keine ausdrücklichen
- Nicht standardmäßige und veraltete Bezeichner wie
throw()oder__declspec(nothrow)sind nicht gleichwertig mitnoexcept. - Explizite Bezeichner
noexcept(false)undnoexcept(true)werden entsprechend beachtet. - Als gekennzeichnete
constexprFunktionen sollen keine Ausnahmen verursachen und nicht analysiert werden. - Die Regel gilt auch für Lambda-Ausdrücke.
- Die Logik berücksichtigt rekursive Aufrufe nicht als potenziell nicht auslösende Aufrufe. Diese Logik kann sich in Zukunft ändern.
Beispiel
Alle Funktionen mit Ausnahme des Destruktors werden gewarnt, da sie keine Fälligkeit verpassen.
struct S
{
S() {} // C26455, Default constructor may not throw. Declare it 'noexcept'
~S() {}
S(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)
S& operator=(S&& s) {/*impl*/} // C26439, This kind of function may not throw. Declare it 'noexcept' (f.6)
S(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
S& operator=(const S& s) {/*impl*/} // C26440, This function can be declared 'noexcept'
};
Ohne die gleiche Struktur zu versehen, werden alle Warnungen entfernt.
struct S
{
S() noexcept {}
~S() {}
S(S&& s) noexcept {/*impl*/}
S& operator=(S&& s) noexcept {/*impl*/}
S(const S& s) noexcept {/*impl*/}
S& operator=(const S& s) noexcept {/*impl*/}
};