«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему Visual Studio 2015 сообщает об ошибке C2280 «Удаленный конструктор копирования» при компиляции кода конструктора перемещения?

Почему Visual Studio 2015 сообщает об ошибке C2280 «Удаленный конструктор копирования» при компиляции кода конструктора перемещения?

Опубликовано 17 ноября 2024 г.
Просматривать:373

Why Does Visual Studio 2015 Report Error C2280 \

Отчеты Visual Studio 2015 C2280: изучение проблемы «Конструктор удаленной копии»

В Visual Studio 2013 компиляция следующего кода выполняется без ошибок :

class A {
public:
   A(){}
   A(A &&{}){};
};

int main(int, char*) {
   A a;
   new A(a);
   return 0;
}

Однако при компиляции в Visual Studio 2015 RC компилятор выдает ошибку C2280:

1> c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)'
: attempting to reference a deleted function

Причина ошибки

Visual Studio 2015 ведет себя иначе, чем ее предшественник. Согласно стандарту C, если определение класса объявляет конструктор перемещения или оператор присваивания перемещения, компилятор неявно генерирует конструктор копирования и оператор присваивания копирования как удаленные. Именно так обстоит дело в предоставленном фрагменте кода, где присутствует конструктор перемещения.

Решение проблемы

Чтобы устранить ошибку компиляции, необходимо явное объявление копии необходим конструктор и оператор присваивания копии по умолчанию:

class A {
public:
   A(){}
   A(A &&{}){};
   A(const A&{}) = default;
};

Благодаря этой модификации компилятор сгенерирует требуемый конструктор копирования и оператор присваивания копирования, не помечая их как удаленные.

Дополнительные соображения

Если класс определяет семантику перемещения, обычно рекомендуется также определить оператор присваивания перемещения и деструктор. Соблюдение принципа «Правила пяти» может помочь обеспечить правильное управление ресурсами.

Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3