Compilerwarnung (Ebene 4) C5267

Definition des impliziten Kopierkonstruktors/Zuordnungsoperators für "type" ist veraltet, da er über einen vom Benutzer bereitgestellten Zuweisungsoperator/Kopierkonstruktor verfügt.

Hinweise

Der C++-Standard ist veraltet (aber nicht entfernt) die implizite Generierung von Kopier- und Zuordnungsoperatoren unter bestimmten Bedingungen. Der MSVC-Compiler generiert weiterhin die Kopier- und Zuweisungsoperatoren unter diesen Bedingungen, kann jedoch sein Verhalten in Zukunft ändern, wenn der Standard das veraltete Verhalten entfernt. Zweck dieser Warnung ist es, ihren Code künftig zu überprüfen, wenn der Ausschuss entscheidet, diese Funktionalität zu entfernen.

Die relevanten Abschnitte im C++-Standard sind:

  • class.copy.ctor paragraph 6, which says: "If the class definition does not explicitly declare a copy constructor, a nonexplicit one is declare implicitly. Wenn die Klassendefinition einen Verschiebungskonstruktor oder einen Zuweisungsoperator deklariert, wird der implizit deklarierte Kopierkonstruktor als gelöscht definiert. andernfalls ist sie standardmäßig festgelegt. Letzterer Fall ist veraltet, wenn die Klasse über einen vom Benutzer deklarierten Kopierzuweisungsoperator oder einen vom Benutzer deklarierten Destruktor verfügt."
  • Anhang D.8, der besagt: "Die implizite Definition eines Kopierkonstruktors als Standard ist veraltet, wenn die Klasse über einen vom Benutzer deklarierten Kopierzuweisungsoperator oder einen vom Benutzer deklarierten Destruktor verfügt. Die implizite Definition eines Kopierzuweisungsoperators als Standard ist veraltet, wenn die Klasse über einen vom Benutzer deklarierten Kopierkonstruktor oder einen vom Benutzer deklarierten Destruktor verfügt. Es ist möglich, dass zukünftige Versionen von C++ angeben, dass diese impliziten Definitionen gelöscht werden."

Beispiel

Im folgenden Code wird die Warnung C5267 angezeigt, wenn eine implizit generierte Sonderfunktion aufgerufen, aber nicht explizit definiert wird. Beides /W4 ist /w45267 erforderlich, um diese Warnung zu erstellen.

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

Um dieses Problem zu beheben, definieren Sie explizit den fehlenden Kopierkonstruktor oder den Zuweisungsoperator zum Kopieren.

Siehe auch

Explizit vorgegebene und gelöschte Funktionen