Sdílet prostřednictvím


Upozornění C26439

Tento druh funkce nemusí vyvolat. Deklarujte ji noexcept.

C++ Core Guidelines F.6: Pokud vaše funkce nesmí vyvolat, deklarujte ji noexcept

Některé operace by nikdy neměly vyvolat výjimky. Jejich implementace by měly být spolehlivé a měly by řádně zpracovávat možné chybové stavy. Neměli by používat výjimky k označení selhání. Toto pravidlo označuje případy, kdy tyto operace nejsou explicitně označené jako noexcept, což znamená, že můžou vyvolat výjimky a spotřebitelé nemohou předpokládat spolehlivost.

Je důležité, aby tyto funkce byly spolehlivé, protože se často používají jako stavební bloky k implementaci funkcí s výjimkou bezpečnostních záruk. Konstruktor přesunutí, který vyvolá, vynutí, aby se kontejnery STL (Standard Template Library) vrátily zpět do operací kopírování a snížily výkon modulu runtime.

Název analýzy kódu: SPECIAL_NOEXCEPT

Poznámky

  • Speciální druhy operací:

    • Destruktory;
    • konstruktory přesunutí a operátory přiřazení;
    • standardní funkce sémantikou pohybu: std::move a std::swap.
  • Nestandardní a zastaralé specifikátory, jako jsou throw() nebo declspec(nothrow) nejsou ekvivalentní noexcept.

  • Explicitní specifikátory noexcept(false) a noexcept(true) jsou odpovídajícím způsobem respektovány.

Příklad

Nástroj varuje všechny funkce s výjimkou destruktoru, protože chybí noexcept.

struct S
{
    ~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'
};

S noexcept dekorací stejné struktury se odeberou všechna upozornění.

struct S
{
    ~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*/}
};

Viz také

C26455
C++ Core Guidelines F.6