Udostępnij za pośrednictwem


Ostrzeżenie kompilatora (poziom 4) C5267

definicja niejawnego konstruktora/operatora przypisania dla "typu" jest przestarzała, ponieważ ma operatora przypisania dostarczonego przez użytkownika/konstruktora kopiowania

Uwagi

Przestarzałe (ale nie usunięto) niejawne generowanie operatorów kopiowania i przypisania w języku C++ w pewnych warunkach. Kompilator MSVC nadal generuje operatory kopiowania i przypisania w tych warunkach, ale może zmienić jego zachowanie w przyszłości, jeśli standard usunie przestarzałe zachowanie. Celem tego ostrzeżenia jest pomoc w przyszłości w weryfikacji kodu, jeśli komisja zdecyduje się usunąć tę funkcję.

Odpowiednie sekcje w standardzie C++ to:

  • class.copy.ctor akapit 6, który mówi: "Jeśli definicja klasy nie deklaruje jawnie konstruktora kopiowania, jawnie zadeklarowany jest żaden niewyjaśniony. Jeśli definicja klasy deklaruje konstruktor przenoszenia lub operator przypisania przenoszenia, niejawnie zadeklarowany konstruktor kopiowania jest definiowany jako usunięty; w przeciwnym razie jest to ustawienie domyślne. Ten ostatni przypadek jest przestarzały, jeśli klasa ma operatora przypisania kopiowania zadeklarowanego przez użytkownika lub destruktora zadeklarowanego przez użytkownika".
  • Załącznik D.8, który mówi: "Niejawna definicja konstruktora kopii jako domyślna jest przestarzała, jeśli klasa ma operator przypisania kopiowania zadeklarowanego przez użytkownika lub destruktor zadeklarowany przez użytkownika. Niejawna definicja operatora przypisania kopiowania jako domyślna jest przestarzała, jeśli klasa ma konstruktor kopii zadeklarowany przez użytkownika lub destruktor zadeklarowany przez użytkownika. Możliwe, że przyszłe wersje języka C++ określą, że te niejawne definicje zostaną usunięte.

Przykład

Poniższy kod przedstawia ostrzeżenie C5267, gdy wywoływana jest niejawnie wygenerowana funkcja specjalna, ale nie jest jawnie zdefiniowana. Oba /W4 elementy i /w45267 są wymagane do wygenerowania tego ostrzeżenia.

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

Aby rozwiązać ten problem, jawnie zdefiniuj brak konstruktora kopii lub operatora przypisania kopiowania.

Zobacz też

Jawnie domyślne i usunięte funkcje