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 noexceptgekennzeichnet 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 und std::swap.
  • Nicht standardmäßige und veraltete Bezeichner wie throw() oder declspec(nothrow) sind nicht gleichwertig mit noexcept.

  • Explizite Bezeichner noexcept(false) und noexcept(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*/}
};

Siehe auch

C26455
C++-Kernrichtlinien F.6