Megosztás:


Figyelmeztetés C26432

If you define or delete any default operation in the type 'type-name', define or delete them all (c.21).

C++ alapvető irányelvek:
C.21: Ha meghatároz vagy =delete bármely másolási, áthelyezési vagy destruktor függvényt, akkor mindegyiket határozza meg =delete

A speciális műveletek, például a konstruktorok feltételezik, hogy megváltoztatják a típusok viselkedését, ezért inkább nyelvi mechanizmusokra támaszkodnak adott forgatókönyvek automatikus kikényszerítéséhez. A kanonikus példa az erőforrás-kezelés. Ha explicit módon definiálja, alapértelmezettként vagy törli ezeket a speciális műveleteket, az azt jelzi, hogy el szeretné kerülni egy adott típus különleges kezelését. Inkonzisztens, ha a többi műveletet nem határozzuk meg, vagyis implicit módon a fordító által töröltként tételezzük fel.

Megjegyzések

Ez az ellenőrzés az öt szabályt valósítja meg, amely a következő műveleteket kezeli különlegesként:

  • másolási konstruktorok,
  • konstruktorok mozgatása,
  • másolási hozzárendelési operátorok,
  • hozzárendelési operátorok áthelyezése, és
  • destruktorok.

A szabály nem ellenőrzi, hogy a műveletek azonos módon vannak-e definiálva. Nem baj, ha a törölt és az alapértelmezett műveleteket explicit módon definiált műveletekkel keveri. Azonban, ha bármelyiket megadja, mindegyiket meg kell adnia.

A hozzáférési szintek nem fontosak, és vegyesek is lehetnek.

A figyelmeztetés egy típus első nem statikus függvénydefinícióját jelöli, típusonként egyszer.

példa

Ebben a példában warning::S csak egy alapértelmezett konstruktort és egy destruktort határoz meg. A no_warning::S deklaráció mind az öt speciális tagfüggvényt meghatározza vagy törli.

// C26432.cpp
namespace warning
{
    struct S
    {
        S() noexcept { ++_count; }
        ~S() { --_count; } // C26432 because only the constructor and destructor are explicitly defined.
        static unsigned _count;
    };
    unsigned S::_count = 0;
}

namespace no_warning
{
    struct S
    {
        S() noexcept { _count++;  }
        S(const S&) = delete;
        S(S&&) = delete;
        S& operator=(const S&) = delete;
        S& operator=(S&&) = delete;
        ~S() { --_count; }
        static unsigned _count;
    };
    unsigned S::_count = 0;
}