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.
Funkci lze deklarovat noexcept.
C++ Core Guidelines F.6: Pokud vaše funkce nesmí vyvolat, deklarujte ji noexcept
Pokud kód nemá způsobit žádné výjimky, měl by být označen pomocí specifikátoru noexcept . Tato poznámka pomáhá zjednodušit zpracování chyb na straně kódu klienta a umožňuje kompilátoru provádět další optimalizace.
Poznámky
- Funkce se považuje za nevyvolání, pokud:
- nemá žádné explicitní
throwpříkazy; - funkce volá v těle, pokud existuje, vyvolá pouze funkce, které nejsou pravděpodobné vyvolání:
constexprnebo funkce označené jakoukoli specifikací výjimek, které zahrnují nehození chování (včetně některých nestandardních specifikací).
- nemá žádné explicitní
- Nestandardní a zastaralé specifikátory, jako
throw()jsou nebo__declspec(nothrow)nejsou ekvivalentnínoexcept. - Explicitní specifikátory
noexcept(false)anoexcept(true)jsou odpovídajícím způsobem respektovány. - Funkce označené jako
constexprnemají způsobit výjimky a nejsou analyzovány. - Pravidlo platí také pro výrazy lambda.
- Logika nebere v úvahu rekurzivní volání jako potenciálně nevyvolání. Tato logika se může v budoucnu změnit.
Příklad
Všechny funkce kromě destruktoru budou varovat, protože chybí noexcept.
struct S
{
S() {} // C26455, Default constructor may not throw. Declare it 'noexcept'
~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 decorating stejné struktury, všechny upozornění jsou odebrána.
struct S
{
S() noexcept {}
~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*/}
};