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.
  • 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.
  • 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*/}
};