Warnung C26440
Funktion kann als 'noexcept' deklariert werden.
C++ Core Guidelines F.6: Wenn Ihre Funktion möglicherweise nicht ausgelöst wird, 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
throw
Aussagen; - Funktionsaufrufe im Textkörper rufen, falls vorhanden, nur Funktionen auf, die nicht ausgelöst werden können:
constexpr
oder 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
constexpr
Funktionen 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*/}
};