Visual Studio 2015 rapporte C2280 : exploration du problème du « constructeur de copie supprimé »
Dans Visual Studio 2013, la compilation du code suivant s'exécute sans erreur :
<code class="cpp">class A { public: A(){} A(A &&{}){}; }; int main(int, char*) { A a; new A(a); return 0; }</code>
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 :
<code class="cpp">class A { public: A(){} A(A &&{}){}; A(const A&{}) = default; };</code>
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 de 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.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!