Предупреждение компилятора (уровень 4) C5267

Определение неявного оператора конструктора или назначения копирования для типа не рекомендуется, так как он имеет оператор назначения, предоставленный пользователем, или конструктор копирования

Замечания

Стандарт C++ устарел (но не удалил) неявное создание операторов копирования и назначения в некоторых условиях. Компилятор MSVC по-прежнему создает операторы копирования и назначения в этих условиях, но может изменить его поведение в будущем, если стандарт удаляет нерекомендуемое поведение. Цель этого предупреждения заключается в том, чтобы помочь в будущем подтвердить код, если комитет решит удалить эту функцию.

Ниже приведены соответствующие разделы в стандарте C++:

  • Class.copy.ctor абзац 6, который говорит: "Если определение класса явно не объявляет конструктор копирования, неявно объявляется неявно. Если определение класса объявляет конструктор перемещения или оператор назначения перемещения, неявно объявленный конструктор копирования определяется как удаленный; в противном случае используется значение по умолчанию. Последний случай не рекомендуется использовать, если класс имеет оператор назначения копирования, объявленный пользователем, или деструктор, объявленный пользователем".
  • Приложение D.8, которое говорит: "Неявное определение конструктора копирования по умолчанию не рекомендуется, если класс имеет оператор назначения копирования, объявленный пользователем, или деструктор, объявленный пользователем. Неявное определение оператора назначения копирования по умолчанию устарело, если класс имеет конструктор копирования, объявленный пользователем, или деструктор, объявленный пользователем. Возможно, что будущие версии C++ будут указывать, что эти неявные определения удаляются".

Пример

В следующем коде показано предупреждение C5267 при вызове неявно созданной специальной функции, но не определено явно. Оба /W4 и /w45267 необходимы для создания этого предупреждения.

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

Чтобы устранить эту проблему, явно определите отсутствующий конструктор копирования или оператор назначения копирования.

См. также

Явно используемые по умолчанию и удаленные функции