Sdílet prostřednictvím


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.

Viz také

C26440 DECLARE_NOEXCEPT