Pourquoi std::Move peut être utilisé sur des objets constants
En général, invoquer std::move sur un objet constant semblerait illogique puisque on s'attend à déplacer ou à modifier l'objet. Cependant, en C 11, l'utilisation de std::move sur des objets constants est autorisée.
Pour élaborer, std::move(cat) n'implique pas que l'objet est réellement déplacé. Au lieu de cela, il demande au compilateur de tenter le déplacement. Dans les cas où la classe ne définit pas de constructeur qui accepte une référence const à une rvalue (par exemple, const Cat&&), le compilateur utilisera la référence const implicite à un constructeur de copie lvalue, effectuant ainsi une copie sécurisée à la place.
Considérons l'exemple suivant :
struct Cat { Cat(){} Cat(const Cat&) {std::cout << "COPY";} Cat(Cat&&) {std::cout << "MOVE";} }; int main() { const Cat cat; Cat cat2 = std::move(cat); }
Même si std::move est utilisé, le message "COPY" sera affiché, indiquant que l'objet a été copié au lieu d'être déplacé.
Ce comportement sert de mécanisme de sécurité. Si le constructeur de copie est désactivé, le compilateur affichera un message d'erreur au développeur.
De plus, le bug mentionné dans le livre de Scott Meyers 'Effective Modern C' n'est pas un problème de stabilité mais un problème de performances. Cela se produit lorsqu'une copie implicite est effectuée alors qu'un déplacement est prévu, ce qui entraîne une exécution plus lente. De plus, de tels bogues peuvent survenir même avec des objets non const dépourvus de constructeurs de déplacement.
En fin de compte, permettre à std::move d'opérer sur des objets constants offre une flexibilité. Les développeurs conservent la possibilité de construire explicitement des objets à partir de références const rvalue si vous le souhaitez.
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!