Visual Studio 2015 rapporte C2280 : exploration du problème du « constructeur de copie supprimée »
Dans Visual Studio 2013, la compilation du code suivant s'exécute sans erreur :
class A {
public:
A(){}
A(A &&{}){};
};
int main(int, char*) {
A a;
new A(a);
return 0;
}
Cependant, lors de la compilation dans Visual Studio 2015 RC, le compilateur génère l'erreur C2280 :
1> c:\dev\foo\foo.cpp(11): error C2280: 'A::A(const A &)' : attempting to reference a deleted function
La raison derrière l'erreur
Visual Studio 2015 se comporte différemment de son prédécesseur. Selon la norme C, si une définition de classe déclare un constructeur de déplacement ou un opérateur d'affectation de déplacement, le compilateur génère implicitement un constructeur de copie et un opérateur d'affectation de copie comme supprimés. C'est le cas dans l'extrait de code fourni, où le constructeur de déplacement est présent.
Résoudre le problème
Pour résoudre l'erreur de compilation, la déclaration explicite de la copie le constructeur et l'opérateur d'affectation de copie par défaut sont nécessaires :
class A {
public:
A(){}
A(A &&{}){};
A(const A&{}) = default;
};
Avec cette modification, le compilateur générera le constructeur de copie et l'opérateur d'affectation de copie requis sans les marquer comme supprimés.
Considérations supplémentaires
Si la classe définit la sémantique du déplacement, il est généralement recommandé de définir également un opérateur d'affectation de déplacement et un destructeur. Suivre le principe de la « Règle de cinq » peut contribuer à garantir une bonne gestion des ressources.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3