Warnung C26439
Diese Art von Funktion kann nicht ausgelöst werden. Deklarieren Sie es "noexcept".
C++ Core Guidelines F.6: Wenn Ihre Funktion nicht ausgelöst werden darf, deklarieren Sie sie noexcept
Einige Vorgänge sollten niemals Ausnahmen auslösen. Ihre Implementierungen sollten zuverlässig sein und mögliche Fehlerbedingungen ordnungsgemäß behandeln. Sie sollten keine Ausnahmen verwenden, um auf Fehler hinzuweisen. Diese Regel kennzeichnet Fälle, in denen solche Vorgänge nicht explizit als noexcept
gekennzeichnet sind, was bedeutet, dass sie Ausnahmen auslösen können und Verbraucher keine Annahmen über ihre Zuverlässigkeit machen können.
Es ist wichtig, dass diese Funktionen zuverlässig sind, da sie häufig als Bausteine zum Implementieren von Funktionen mit Ausnahmesicherheitsgarantien verwendet werden. Ein Verschiebungskonstruktor, der ausgelöst wird, erzwingt, dass Standardvorlagenbibliothekscontainer (STANDARD Template Library, STL) auf Kopiervorgänge zurückfallen, wodurch die Laufzeitleistung reduziert wird.
Codeanalysename: SPECIAL_NOEXCEPT
Hinweise
Besondere Betriebsarten:
- Destruktoren;
- Konstruktoren verschieben und Zuordnungsoperatoren verschieben;
- Standardfunktionen mit Bewegungssemantik:
std::move
undstd::swap
.
Nicht standardmäßige und veraltete Bezeichner wie
throw()
oderdeclspec(nothrow)
sind nicht gleichwertig mitnoexcept
.Explizite Bezeichner
noexcept(false)
undnoexcept(true)
werden entsprechend beachtet.
Beispiel
Das Tool warnt für alle Funktionen mit Ausnahme des Destruktors, da sie fehlen noexcept
.
struct S
{
~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'
};
Bei noexcept
der Dekoration derselben Struktur werden alle Warnungen entfernt.
struct S
{
~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*/}
};