Au point 29 de Effective Modern C++, Scott Meyers énumère trois scénarios dans lesquels la sémantique des déplacements n'améliore pas les performances du code,
[ ] déplacer la sémantique ne vous sert à rien :
- Aucune opération de déménagement : L'objet à déplacer ne propose pas d'opérations de déplacement [ ].
- Ne bougez pas plus vite : [ ] des opérations de déplacement qui ne sont pas plus rapides que ses opérations de copie.
- Déplacement non utilisable : Le contexte [ ] requiert une opération de déplacement qui n'émet pas d'exceptions, mais cette opération n'est pas déclarée.
noexcept
.
qui sont toutes clairement expliquées dans les pages précédentes, et en ajoute une autre
[ ] un autre scénario où la sémantique du déplacement n'offre aucun gain d'efficacité :
- L'objet source est lvalue : À quelques exceptions près (voir par exemple le point 25), seules les valeurs r peuvent être utilisées comme source d'une opération de déplacement.
(Le point 25 est intitulé Utilisez std::move
sur les références rvalue et std::forward
sur les références universelles mais je ne vois pas en quoi il est lié au point qui y fait référence).
Ensuite, le texte revient essentiellement à un résumé de l'article, sans autre référence au quatrième point.
À quoi ce point fait-il référence ?
D'après ce que je comprends de la sémantique des déplacements, même si je veux passer d'une valeur lval, disons x
je dois encore le convertir en une rvalue via std::move(x)
(ou un équivalent static_cast
), donc techniquement je me déplace toujours à partir d'une rvalue (spécifiquement une xvalue dans ce cas), pas d'une lvalue.
Je serais donc tenté de dire qu'une lvalue ne peut pas être l'objet source d'une opération de déplacement.
Qu'est-ce que j'ai manqué à ce sujet ?