"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Pourquoi les implémentations de déplacement par défaut étaient-elles absentes dans les premières versions C++11 ?

Pourquoi les implémentations de déplacement par défaut étaient-elles absentes dans les premières versions C++11 ?

Publié le 2024-11-19
Parcourir:695

Why Were Default Move Implementations Absent in Early C  11 Drafts?

Pourquoi les implémentations de déplacement par défaut sont-elles absentes des premières versions C 11 ?

Dans les premières versions de la norme C 11, la génération implicite de constructeurs de déplacement et d'opérateurs d'affectation était un sujet de débat. Cela a conduit à des modifications dans les versions ultérieures, entraînant le comportement suivant dans les compilateurs actuellement disponibles :

Sémantique de déplacement implicite

Depuis la version de novembre de la norme C (N3225), les constructeurs de déplacement implicite et l'affectation Les opérateurs peuvent être générés dans les conditions suivantes :

  • La classe n'a pas de constructeur de copie déclaré par l'utilisateur.
  • La classe n'a pas opérateur d'affectation de copie déclaré par l'utilisateur.
  • La classe n'a pas d'opérateur d'affectation de déplacement déclaré par l'utilisateur.
  • La classe n'a pas de destructeur déclaré par l'utilisateur.
  • Le constructeur de déplacement ne le ferait pas être implicitement défini comme supprimé.

Explication de l'absence dans les premières versions

La décision de ne pas inclure le déplacement par défaut Les implémentations constructeur/affectation dans les premières versions étaient le résultat de préoccupations concernant le potentiel de confusion et de comportement inattendu. Cependant, les révisions ultérieures ont résolu ces problèmes en resserrant les conditions de génération de mouvements implicites.

Solution de contournement

Si vous cherchez un moyen d'utiliser la sémantique de déplacement sans écrire de constructeurs/opérateurs d'affectation explicites , vous pouvez utiliser la [macro de GManNickG](https://stackoverflow.com/a/12316884/8674521). Cette macro génère la sémantique de déplacement nécessaire pour votre classe.

En implémentant la sémantique de déplacement, vous pouvez également refuser de fournir une fonction de membre d'échange.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3