Erreur du compilateur C C2280 "tentative de référencer une fonction supprimée" dans Visual Studio 2013 et 2015
Le compilateur C dans Microsoft Visual Studio 2013 et 2015 gère différemment les constructeurs de copie et les opérateurs d'affectation.
Visual Studio 2013
Si un constructeur de copie ou un opérateur d'affectation de déplacement n'est pas explicitement déclaré dans la définition de classe, le compilateur les générera implicitement.
Visual Studio 2015
Cependant, dans Visual Studio 2015, si une définition de classe inclut un constructeur de déplacement ou un opérateur d'affectation de déplacement, la copie implicitement déclarée Le constructeur est défini comme supprimé.
Énoncé du problème
Le code suivant se compile avec succès dans Visual Studio 2013 mais génère l'erreur C2280 dans Visual Studio 2015 :
<code class="cpp">class A { public: A(){} A(A &&&) {} }; int main(int, char*) { A a; new A(a); return 0; }</code>
C2280 : 'A::A(const A &)' tentant de référencer une fonction supprimée
Résolution
Pour résoudre ce problème erreur dans Visual Studio 2015, il faut déclarer explicitement le constructeur de copie et l'opérateur d'affectation de déplacement, ou utiliser le constructeur par défaut :
Option 1 : déclarer explicitement le constructeur de copie et l'opérateur d'affectation de déplacement
<code class="cpp">class A { public: A(){} A(A &&&) {} A(const A&) = default; // Default copy constructor A& operator=(const A&) = default; // Default move assignment operator };</code>
Option 2 : Définir la classe comme supprimée ou incomplète
<code class="cpp">class A { public: A(){} A(A &&&) = delete; // Mark copy constructor as deleted A(const A&); // Incomplete constructor (cannot be instantiated) A& operator=(const A&); // Incomplete assignment operator (cannot be instantiated) };</code>
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!