Отчеты 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