Visual Studio 2015 informa C2280: Explorando el problema del "Constructor de copia eliminado"
En Visual Studio 2013, la compilación del siguiente código se ejecuta sin errores :
class A {
public:
A(){}
A(A &&{}){};
};
int main(int, char*) {
A a;
new A(a);
return 0;
}
Sin embargo, al compilar en Visual Studio 2015 RC, el compilador genera el error C2280:
1> c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)' : attempting to reference a deleted function
La razón detrás del error
Visual Studio 2015 se comporta de manera diferente a su predecesor. Según el estándar C, si una definición de clase declara un constructor de movimiento o un operador de asignación de movimiento, el compilador genera implícitamente un constructor de copia y un operador de asignación de copia como eliminados. Este es el caso del fragmento de código proporcionado, donde el constructor de movimiento está presente.
Solucionando el problema
Para resolver el error de compilación, la declaración explícita de la copia El constructor y el operador de asignación de copia por defecto son necesarios:
class A {
public:
A(){}
A(A &&{}){};
A(const A&{}) = default;
};
Con esta modificación, el compilador generará el constructor de copia requerido y el operador de asignación de copia sin marcarlos como eliminados.
Consideraciones adicionales
Si la clase define la semántica de movimiento, generalmente se recomienda definir también un operador de asignación de movimiento y un destructor. Seguir el principio de la "Regla de los cinco" puede ayudar a garantizar una gestión adecuada de los recursos.
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