Upozornění C26440
Funkci lze deklarovat noexcept.
C++ Core Guidelines F.6: Pokud se vaše funkce nemusí 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í
throw
příkazy; - funkce volá v těle, pokud existuje, vyvolá pouze funkce, které nejsou pravděpodobné vyvolání:
constexpr
nebo 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
constexpr
nemají 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*/}
};