Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Tento druh funkce nemusí vyvolat. Deklarujte ji noexcept.
F.6: Pokud vaše funkce nesmí vyvolat výjimku, 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::moveastd::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*/}
};
Viz také
C26455
F.6: Pokud vaše funkce nesmí vyvolat výjimku, deklarujte ji noexcept