Error del compilador C2280 "Intentando hacer referencia a una función eliminada" en Visual Studio 2015
El compilador de Visual Studio 2015, a diferencia de su predecesor de 2013, genera automáticamente un constructor de copia eliminado para las clases que definen un constructor de movimiento o un operador de asignación de movimiento. Este comportamiento lo exige el estándar C para evitar la copia accidental en situaciones en las que se prefiere el movimiento.
En su fragmento de código, la clase A tiene un constructor de movimiento A(A &&), que a su vez implica una copia eliminada. Constructor según norma. En consecuencia, la nueva expresión A(a) en main desencadena el error C2280.
Para resolver este problema, puede declarar explícitamente el constructor de copia en A:
class A {
public:
A() {}
A(A &&) {}
A(const A&) = default; // Explicitly declare the copy constructor as defaulted
};
Alternativamente, si realmente tiene la intención de deshabilitar la copia y solo permitir el movimiento, puede declarar el constructor de copia y el operador de asignación de copia como eliminados:
class A {
public:
A() {}
A(A &&) {}
A(const A&) = delete;
A& operator=(const A&) = delete; // Delete copy assignment operator
};
Recuerde, si elige deshabilitar la copia, también deberá declarar un operador de asignación de movimiento y un destructor para cumplir con la Regla de Cinco.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3