Upozornění C26447
Funkce je deklarována
noexcept
, ale volá funkci function_name , která může vyvolat výjimky (f.6).
Pokyny pro C++ Core:
F.6: Pokud se vaše funkce nemusí vyvolat, deklarujte ji noexcept.
Poznámky
Toto pravidlo změní jiné pravidlo C26440 DECLARE_NOEXCEPT, které se snaží najít funkce, které jsou vhodnými kandidáty na označení jako noexcept
. V tomto případě je myšlenka, že jakmile označíte nějakou funkci jako noexcept
, musí zachovat její kontrakt tím, že nevyvolá jiný kód, který může vyvolat výjimky.
- Kompilátor Jazyka Microsoft C++ již zpracovává jednoduchá porušení, jako
throw
jsou příkazy v těle funkce (viz C4297). - Pravidlo se zaměřuje pouze na volání funkcí. Označí cíle, které nejsou
constexpr
a které můžou potenciálně vyvolat výjimky. Jinými slovy, nejsou explicitně označeny jako nevyvolání pomocí ,noexcept
__declspec(nothrow)
nebo throw(). - Cílové funkce generované kompilátorem se přeskočí, aby se snížil šum, protože kompilátor neposkytuje specifikace výjimek vždy.
- Kontrola také přeskočí speciální druhy cílových funkcí, které očekáváme, že implementujete jako
noexcept
; toto pravidlo vynucuje C26439 SPECIAL_NOEXCEPT.
Příklad
#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;
}
Tato upozornění můžete opravit odebráním noexcept
z podpisu funkce.