Share via


Upozornění kompilátoru (úroveň 4) C5267

definice implicitního konstruktoru kopírování/operátoru přiřazení pro 'type' je zastaralá, protože má operátor přiřazení zadaný uživatelem /konstruktor copy

Poznámky

Standard C++ je za určitých podmínek zastaralý (ale neodebral) implicitní generování operátorů kopírování a přiřazení. Kompilátor MSVC za těchto podmínek stále generuje operátory kopírování a přiřazení, ale v budoucnu může změnit jeho chování, pokud standard odebere zastaralé chování. Účelem tohoto upozornění je pomoct budoucí ověření kódu, pokud se výbor rozhodne tuto funkci odebrat.

Relevantní části standardního jazyka C++ jsou:

  • class.copy.ctor odstavec 6, který říká: "Pokud definice třídy explicitně deklaruje konstruktor kopírování, je neexplicit jeden deklarován implicitně. Pokud definice třídy deklaruje konstruktor přesunutí nebo operátor přiřazení přiřazení, implicitně deklarovaný konstruktor kopírování je definován jako odstraněn; v opačném případě je ve výchozím nastavení. Druhý případ je zastaralý, pokud třída má operátor přiřazení kopírování deklarovaný uživatelem nebo destruktor deklarovaný uživatelem."
  • Příloha D.8, která říká: "Implicitní definice konstruktoru kopírování jako výchozí je zastaralá, pokud třída má uživatelem deklarovaný operátor přiřazení kopírování nebo destruktor deklarovaný uživatelem. Implicitní definice operátoru přiřazení kopírování jako výchozí je zastaralá, pokud třída má uživatelem deklarovaný konstruktor kopírování nebo uživatelem deklarovaný destruktor. Je možné, že budoucí verze jazyka C++ určí, že se tyto implicitní definice odstraní."

Příklad

Následující kód ukazuje upozornění C5267, když je volána implicitně vygenerovaná speciální funkce, ale není explicitně definována. /w45267 K vytvoření tohoto upozornění se vyžaduje obojí/W4.

// C5267.cpp
// compile using: /W4 /w45267
struct CopyCtorOnly
{
    CopyCtorOnly() = default;
    CopyCtorOnly(const CopyCtorOnly&) {} // C5267
};

struct CopyAssignOpOnly
{
    CopyAssignOpOnly() = default;
    CopyAssignOpOnly& operator=(const CopyAssignOpOnly&) // C5267
    {
        return *this;
    }
};

int main()
{
    CopyCtorOnly a1, a2;
    a1 = a2; // Calls deprecated copy assignment operator

    CopyAssignOpOnly b1;
    CopyAssignOpOnly b2 = b1; // Calls deprecated copy constructor
}

Pokud chcete tento problém vyřešit, explicitně definujte chybějící konstruktor kopírování nebo operátor přiřazení kopírování.

Viz také

Explicitně přednastavené a odstraněné funkce