Déplacer l'opérateur d'affectation et if (this != &rhs)
Dans l'opérateur d'affectation de copie d'une classe, c'est une pratique courante pour vérifier si l'objet assigné est l'objet appelant pour empêcher l'auto-affectation :
Class& Class::operator=(const Class& rhs) { if (this != &rhs) { // Do the assignment } return *this; }
Cette vérification est cruciale pour éviter l'objet ne soit pas affecté à lui-même, ce qui peut entraîner un comportement inattendu ou des erreurs. Cependant, dans le cas de l'opérateur d'affectation de déménagement, la nécessité de ce contrôle est discutable.
Avons-nous besoin du même contrôle pour l'opérateur d'affectation de déménagement ?
Class& Class::operator=(Class&& rhs) { if (this != &rhs) { // Do the assignment } return *this; }
La question se pose de savoir s'il peut y avoir des situations où this == &rhs serait vrai pour l'opérateur d'affectation de déplacement. La réponse dépend de l'interprétation de l'opérateur d'affectation de déplacement.
Interprétations de l'opérateur d'affectation de déplacement :
Il existe deux interprétations principales de l'opérateur d'affectation de déplacement :
Normes actuelles et futures :
Le C 11 La norme n'exige pas explicitement une interprétation spécifique de l'opérateur d'affectation de déplacement. Cependant, il permet au programmeur de définir le comportement grâce à l'implémentation de l'opérateur d'affectation de déplacement.
Le projet de travail C 20 proposé comprend une section sur l'affectation de déplacement qui suggère que l'affectation automatique de déplacement ne devrait pas planter, mais il ne précise pas s'il doit conserver la valeur actuelle ou laisser l'objet dans un état valide mais non spécifié state.
Conclusion :
La nécessité de la vérification if (this != &rhs) dans l'opérateur d'affectation de déplacement est une question d'interprétation et d'exigences spécifiques de mise en œuvre. Si l'on s'attend à ce que l'auto-affectation conserve la valeur actuelle, alors la vérification est nécessaire. Sinon, il peut être omis à titre d'optimisation.
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!