Megosztás:


Figyelmeztetés C26440

A függvény "noexcept" deklarálható.

C++ Alapvető irányelvek F.6: Ha a függvény nem dobhat, deklarálja noexcept

Ha a kódnak nem kellene kivételeket okoznia, akkor azt a noexcept kijelölővel kell megjelölni. Ez a megjegyzés segít leegyszerűsíteni a hibakezelést az ügyfélkód oldalán, és lehetővé teszi, hogy a fordító több optimalizálást hajtson végre.

Megjegyzések

  • A függvény nem dobásnak minősül, ha:
    • nem rendelkezik explicit throw állításokkal;
    • függvényhívások a törzsében, ha vannak ilyenek, csak olyan függvényeket hívnak meg, amelyek nem valószínű, hogy dobnak: constexpr vagy olyan kivételspecifikációval megjelölt függvények, amelyek nem dobással járó viselkedéssel járnak (beleértve néhány nem szabványos specifikációt is).
  • Nem szabványos és elavult azonosítók, például throw() a __declspec(nothrow)noexcept.
  • Explicit megadók noexcept(false) , és noexcept(true) megfelelően vannak betartva.
  • A megjelölt constexpr függvények nem okozhatnak kivételeket, és nem elemeznek.
  • A szabály a lambda kifejezésekre is vonatkozik.
  • A logika nem tekinti a rekurzív hívásokat potenciálisan nem dobásmentesnek. Ez a logika a jövőben változhat.

példa

A destruktor kivételével minden függvény figyelmeztetni fog, mert hiányzik a 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'
};

Ha a noexcept ugyanazt a struktúrát díszíti, az összes figyelmeztetés el lesz távolítva.

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*/}
};