Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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;
}