Je vais être hyper réducteur: je n'en ai plus besoin, je move :).
Par contre, la sémantique de mouvement à changé ma façon d'envoyer des paramètres, il y a beaucoup plus de copie qu'avant (cf. type plein). Mais en apparence seulement, l'appelant décide lui-même si oui ou non une rvalue est approprié. Bien sûr, je ne le fais pas pour tout, mais uniquement pour les paramètres qui vont être absorbés par la classe/fonction (principalement les constructeurs).
Parmi les exemples possibles, j'en vois 2:
- responsabilité unique (unique_ptr est un bon exemple)
- performance (parce qu'un move n'est pas moins rapide qu'une copie quand possible). Je dis performance, mais il serait mieux de parler de sémantique: s'il y a copie, c'est que la variable d'origine est importante. Comme exemple, une implémentation de
std::vector ::erase(It)
?
while (cin >> s) vec.emplace_back(std::move(s))
?
Il y a quand même un piège: les structures ne garantissent pas toujours l'affectation de mouvement sur soi-même. C'est le cas de std::vecteur, il faut passer par une temporaire pour avoir cet garanti.
Le cours va-t-il parler des fonctions ref-qualifiée ? Le truc qui permet de faire
a.foo()
// affiche "je suis "
std::move(a).foo()
// affiche "schizo !"
PS: Comment fait-on pour voir les tutos en bétâ ?