Salut, j'ai quelques petites remarques
a- Pour swap, habituellement (même si ça ne changera rien dans cet exemple précis), on va faire un using std::swap;
puis appeler swap(this->m_toto, other_.m_toto);
directement. On profite du Koening Namespace Lookup/ADL pour appeler le bon swap.
b- Intéressant std::exchange
, j'avais zappé son apparition
c- Pour le move-and-swap, je ne saurais trop dire s'il est pertinent. Il me semble avoir croisé des critiques assez fortes sur GOTW, mais Meyers qui n'excluait pas son utilisation.
d- "Petite astuce pour les feignants". Pour bien faire, il manquerait la même chose pour la destructeur. C'est dans la continuité de la règle du "tout ou rien" qui est un raffinement de la règle du 0/5. http://arne-mertz.de/2015/02/the-rule-of-zero-revisited-the-rule-of-all-or-nothing/ (Meyers semble avoir validé cette évolution dans les commentaires de son billet où il proposait lui-même un patch sur la règle du 0/5).
e- Quand j'ai étudié la sémantique de déplacement, je me suis heurté à quelques évidences (après réflexion) qui sur le coup n'en étaient pas.
T && ref = std::move(variable);
n'implique aucun déplacement. On ne fait que créer une référence. Le déplacement sera une conséquence d'un appel à un constructeur de déplacement ou un opérateur de déplacement par affectation, ou d'une fonction qui va procéder à des choses équivalentes (genre push_back
ou emplace_back
). Et c'est à cause de ce détail technique que Sutter et Meyers sont en discordes sur les signatures de fonctions puits (cf mon point h-)
f- Il est important de rappeler qu'après déplacement un objet volé doit offrir une garantie basique: il doit être destructible. Voire affectable. Après on peut supposer qu'il est une erreur de programmation de vouloir faire plus avec (un des articles sur l'évolution du langage sous-entendait ça – une des conséquences étant que le test &other == this
était superflu sur un opérateur de déplacement).
g- Les déplacements seront permis sur le vecteur si les types déplaçables le sont avec une garantie de noexcept
.
h- Il pourrait être intéressant de donner la signature des fonctions puits qui reçoivent des objets, mais des gurus comme Sutter et Meyers ne semblent pas d'accord sur la signature idiomatique dans le "simple" cas des objets uniquement déplaçables…