Avertissement du compilateur (niveau 4) C5267
la définition de constructeur/d’affectation de copie implicite pour « type » est déconseillée, car elle a un opérateur d’affectation/constructeur de copie fourni par l’utilisateur
Notes
La norme C++ déconseillée (mais n’a pas supprimé) la génération implicite d’opérateurs de copie et d’affectation dans certaines conditions. Le compilateur MSVC génère toujours les opérateurs de copie et d’affectation dans ces conditions, mais peut modifier son comportement à l’avenir si la norme supprime le comportement déconseillé. L’objectif de cet avertissement est d’aider à la preuve future de votre code si le comité décide de supprimer cette fonctionnalité.
Les sections pertinentes de la norme C++ sont les suivantes :
- class.copy.ctor paragraphe 6, qui indique : « Si la définition de classe ne déclare pas explicitement un constructeur de copie, un constructeur nonexplicit est déclaré implicitement. Si la définition de classe déclare un constructeur de déplacement ou un opérateur d’affectation de déplacement, le constructeur de copie implicitement déclaré est défini comme supprimé ; sinon, elle est par défaut. Ce dernier cas est déconseillé si la classe a un opérateur d’attribution de copie déclaré par l’utilisateur ou un destructeur déclaré par l’utilisateur.
- Annexe D.8, qui indique : « La définition implicite d’un constructeur de copie comme valeur par défaut est déconseillée si la classe a un opérateur d’affectation de copie déclaré par l’utilisateur ou un destructeur déclaré par l’utilisateur. La définition implicite d’un opérateur d’affectation de copie comme valeur par défaut est déconseillée si la classe a un constructeur de copie déclaré par l’utilisateur ou un destructeur déclaré par l’utilisateur. Il est possible que les futures versions de C++ spécifient que ces définitions implicites sont supprimées. »
Exemple
Le code suivant montre l’avertissement C5267 lorsqu’une fonction spéciale générée implicitement est appelée, mais n’est pas définie explicitement. Les deux /W4
et /w45267
sont nécessaires pour produire cet avertissement.
// C5267.cpp
// compile using: /W4 /w45267
struct CopyCtorOnly
{
CopyCtorOnly() = default;
CopyCtorOnly(const CopyCtorOnly&) {} // C5267
};
struct CopyAssignOpOnly
{
CopyAssignOpOnly() = default;
CopyAssignOpOnly& operator=(const CopyAssignOpOnly&) // C5267
{
return *this;
}
};
int main()
{
CopyCtorOnly a1, a2;
a1 = a2; // Calls deprecated copy assignment operator
CopyAssignOpOnly b1;
CopyAssignOpOnly b2 = b1; // Calls deprecated copy constructor
}
Pour résoudre ce problème, définissez explicitement le constructeur de copie manquant ou l’opérateur d’affectation de copie.