Maison > développement back-end > C++ > 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
Libérer: 2024-10-27 04:00:29
original
853 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal