Megosztás:


Figyelmeztetés C26439

Előfordulhat, hogy ez a fajta függvény nem dob kivételt. Deklarálja a "noexcept"-et.

F.6: Ha a függvény nem dobhat, jelölje meg noexcept

Egyes műveleteknek soha nem szabad kivételeket kivenni. Az implementációknak megbízhatónak kell lenniük, és a lehetséges hibafeltételeket kecsesen kell kezelniük. Nem használhatnak kivételeket a hiba jelzésére. Ez a szabály megjelöli azokat az eseteket, amikor az ilyen műveletek nincsenek explicit módon megjelölve noexcept, ami azt jelenti, hogy kivételeket vethetnek ki, és a fogyasztók nem tehetnek feltételezéseket a megbízhatóságáról.

Fontos, hogy ezek a függvények megbízhatóak legyenek, mivel gyakran építőelemként használják őket a függvények kivételbiztonsági garanciákkal történő implementálásához. A dobó áthelyezési konstruktor arra kényszeríti a Standard Sablontár (STL) tárolóit, hogy visszaesjenek a másolási műveletekbe, csökkentve a futtatókörnyezet teljesítményét.

Kódelemzés neve: SPECIAL_NOEXCEPT.

Megjegyzések

  • Speciális műveletek:

    • destruktorok;
    • konstruktorok áthelyezése és hozzárendelési operátorok áthelyezése;
    • standard függvények mozgató szemantikával: std::move és std::swap.
  • A nem szabványos és elavult specifikátorok, mint például throw() vagy declspec(nothrow), nem egyenértékűek a noexcept-vel.

  • Explicit megadók noexcept(false) , és noexcept(true) megfelelően vannak betartva.

példa

Az eszköz a destruktor kivételével minden függvényre figyelmeztet, mert hiányoznak 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'
};

A noexcept ugyanazon szerkezet dekorálásával minden figyelmeztetést eltávolítanak.

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

Lásd még

C26455
F.6: Ha a függvény nem dobhat, jelölje meg noexcept