Warnung C26447

Die Funktion wird deklariert noexcept , ruft jedoch Die Funktion function_name auf, die Ausnahmen auslösen kann (f.6).

C++-Kernrichtlinien:
F.6: Wenn Ihre Funktion nicht ausgelöst werden kann, deklarieren Sie sie noexcept.

Hinweise

Diese Regel ändert eine andere Regel, C26440 DECLARE_NOEXCEPT, die versucht, Funktionen zu finden, die gut geeignet sind, als zu markieren noexcept. In diesem Fall ist die Idee, dass, sobald Sie eine Funktion als noexceptgekennzeichnet haben, seinen Vertrag beibehalten muss, indem er keinen anderen Code aufruft, der Ausnahmen auslösen kann.

  • Der Microsoft C++-Compiler behandelt bereits einfache Verstöße wie throw Anweisungen im Funktionstext (siehe C4297).
  • Die Regel konzentriert sich nur auf Funktionsaufrufe. Es kennzeichnet Ziele, die nicht constexpr sind und die möglicherweise Ausnahmen auslösen können. Mit anderen Worten, sie werden nicht explizit als nicht ausgelöst durch Verwenden noexceptvon , __declspec(nothrow)oder Throw() gekennzeichnet.
  • Die vom Compiler generierten Zielfunktionen werden übersprungen, um das Rauschen zu reduzieren, da Ausnahmespezifikationen nicht immer vom Compiler bereitgestellt werden.
  • Die Überprüfung überspringt auch spezielle Arten von Zielfunktionen, die wir erwarten, als noexcept; diese Regel wird von C26439 SPECIAL_NOEXCEPT erzwungen.

Beispiel

#include <vector>
#include <string>
#include <istream>

std::vector<std::string> collect(std::istream& is) noexcept
{
    std::vector<std::string> res;
    for (std::string s; is >> s;) // C26447, `operator bool()` can  throw, std::string's allocator can throw
        res.push_back(s);         // C26447, `push_back` can throw
    return res;
}

Sie können diese Warnungen beheben, indem Sie die Funktionssignatur entfernen noexcept .

Siehe auch

C26440-DECLARE_NOEXCEPT