Maison  >  Article  >  développement back-end  >  Pourquoi Visual Studio 2015 renvoie-t-il l'erreur C2280 « tentative de référencement à une fonction supprimée » lors de la compilation du code qui fonctionne dans Visual Studio 2013 ?

Pourquoi Visual Studio 2015 renvoie-t-il l'erreur C2280 « tentative de référencement à une fonction supprimée » lors de la compilation du code qui fonctionne dans Visual Studio 2013 ?

Barbara Streisand
Barbara Streisandoriginal
2024-10-27 04:00:29793parcourir

Why Does Visual Studio 2015 Throw Error C2280

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn