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 noexcept
gekennzeichnet 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 Verwendennoexcept
von ,__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
.