Sdílet prostřednictvím


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