En C, la fonction std::move est utilisée pour transférer la propriété d'un objet. Cependant, une question courante se pose : pourquoi est-il possible d'appeler std::move sur un objet const ? N'est-ce pas contre-intuitif et potentiellement dangereux ?
L'astuce réside dans le fait que std::move(const_object) n'effectue pas de déplacement réel. Au lieu de cela, il demande au compilateur de tenter un déplacement. Si la classe n'a pas de constructeur qui accepte une référence const à une rvalue (constructeur de déplacement), le compilateur utilisera par défaut le constructeur de copie implicite.
Considérez 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); // prints "COPY" }
Comme vous pouvez le voir, même si cat est un objet const, le compilateur construit cat2 en toute sécurité en tant que copie. En effet, aucun constructeur de déplacement n'est disponible pour les objets const dans cet exemple.
Le piège potentiel souligné par Scott Meyers dans "Effective Modern C" est un problème de performances plutôt qu'un problème de stabilité. Essentiellement, tenter de se déplacer à partir d'un objet const lorsqu'un constructeur de déplacement n'est pas disponible entraînera une copie moins efficace.
Bien qu'il puisse sembler logique d'empêcher std::move d'opérer sur des objets const, il est ce n'est pas une solution simple pour les raisons suivantes :
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!