136 votes

Déplacer l'opérateur d'affectation et `if (this != &rhs)`.

Dans l'opérateur d'assignation d'une classe, vous devez généralement vérifier si l'objet assigné est l'objet invoquant afin de ne pas tout gâcher :

Class& Class::operator=(const Class& rhs) {
    if (this != &rhs) {
        // do the assignment
    }

    return *this;
}

Avez-vous besoin de la même chose pour l'opérateur d'affectation des mouvements ? Existe-t-il une situation dans laquelle this == &rhs serait vrai ?

? Class::operator=(Class&& rhs) {
    ?
}

12 votes

Sans rapport avec la question posée, et juste pour que les nouveaux utilisateurs qui lisent cette question dans le futur (car je sais que Seth le sait déjà) ne se fassent pas de fausses idées, Copie et échange est la manière correcte d'implémenter l'opérateur d'assignation de copie dans lequel vous n'avez pas besoin de vérifier l'auto-assignation et-all.

0 votes

La signature doit-elle être const Class&& o Class&& ?

0 votes

Dans des circonstances normales, l'affectation de mouvements vers/depuis le même objet ne pourrait pas se produire. La référence rvalue signifie que vous effectuez une affectation à partir d'un objet temporaire et que rien d'autre ne devrait y faire référence. Une assertion serait peut-être plus appropriée.

0voto

little_monster Points 21

Il y a une situation à laquelle je pense (this == rhs). Pour cette déclaration : Maclasse obj ; std::move(obj) = std::move(obj)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X