Maison > développement back-end > C++ > Avons-nous besoin de l'enregistrement « if (this != &rhs) » dans les opérateurs d'affectation de déplacement C ?

Avons-nous besoin de l'enregistrement « if (this != &rhs) » dans les opérateurs d'affectation de déplacement C ?

Mary-Kate Olsen
Libérer: 2024-12-05 22:16:11
original
606 Les gens l'ont consulté

Do We Need the `if (this != &rhs)` Check in C   Move Assignment Operators?

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

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

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 :

  1. Préserve la valeur actuelle : Certains soutiennent que l'auto-déplacement-affectation (où ceci == &rhs) doit conserver la valeur actuelle de l'objet. Dans ce cas, la vérification if (this != &rhs) est nécessaire pour éviter une auto-affectation accidentelle.
  2. Prend un état valide : D'autres soutiennent que l'opérateur d'auto-déplacement-affectation ne doit pas nécessairement conserver la valeur actuelle mais doit laisser l'objet dans un état valide. Dans ce cas, la vérification if (this != &rhs) n'est pas strictement nécessaire. Cependant, cela peut quand même être utile en guise d'optimisation pour éviter d'effectuer l'opération de déplacement sur auto-affectation.

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!

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