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
astd::swap
.
Nestandardní a zastaralé specifikátory, jako jsou
throw()
nebodeclspec(nothrow)
nejsou ekvivalentnínoexcept
.Explicitní specifikátory
noexcept(false)
anoexcept(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*/}
};