Maison >développement back-end >C++ >Comment les constructeurs de déplacement et les opérateurs d'affectation sont-ils implicitement générés en C ?

Comment les constructeurs de déplacement et les opérateurs d'affectation sont-ils implicitement générés en C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-01 17:48:16601parcourir

How Are Move Constructors and Assignment Operators Implicitly Generated in C  ?

Génération implicite d'opérations de déplacement en C

Dans les premières versions de la norme C 11, il y a eu un débat concernant la génération implicite d'opérations de déplacement constructeurs et opérateurs d’affectation. Cela était dû à des préoccupations concernant les implications potentielles en termes de performances et au désir de fournir plus de contrôle aux programmeurs sur ces opérations.

Spécification actuelle

La spécification actuelle (N3225) indique que les constructeurs de déplacement et les opérateurs d'affectation seront implicitement déclarés comme valeurs par défaut si :

  • La classe n'a pas de copie définie par l'utilisateur constructeur
  • La classe n'a pas d'opérateur d'affectation de copie défini par l'utilisateur
  • La classe n'a pas d'opérateur d'affectation de déplacement défini par l'utilisateur
  • La classe n'a pas d'utilisateur -destructeur défini
  • Le constructeur de déplacement ne serait pas implicitement défini comme supprimé

Résoudre le problème

Bien que le comportement par défaut ait changé au fil du temps, il existe plusieurs façons de remédier au manque d'opérations de déplacement implicites dans les anciens compilateurs :

  • Implémenter manuellement les constructeurs de déplacement/opérateurs d'affectation : C'est le plus approche simple, mais elle nécessite du code supplémentaire et peut être sujette à des erreurs si elle n'est pas mise en œuvre correctement.
  • Utiliser une macro : Les macros peuvent être utilisées pour générer automatiquement des constructeurs de déplacement et des opérateurs d'affectation. Par exemple, la réponse de GManNickG fournit une macro qui peut être utilisée à cette fin.
  • Envisagez un compilateur conforme C 11 : Si possible, effectuez une mise à niveau vers un compilateur prenant en charge la génération implicite d'opérations de déplacement. selon la spécification C 11 actuelle.

Supplémentaire Considérations

Il est important de noter que la mise en œuvre de la sémantique de déplacement élimine le besoin d'une fonction membre d'échange. De plus, le constructeur de déplacement et l'opérateur d'affectation ne doivent être utilisés que lorsque la classe gère ses propres ressources, telles que la mémoire allouée dynamiquement. Pour les classes qui contiennent uniquement des types POD et des conteneurs STL, la sémantique de copie par défaut est généralement suffisante.

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