Maison  >  Article  >  développement back-end  >  Pouvez-vous passer d'un objet Const en C ?

Pouvez-vous passer d'un objet Const en C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-11-18 09:49:02648parcourir

Can You Move From a Const Object in C  ?

Comprendre std::move sur les objets const : dévoiler le piège des performances

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&amp;) {std::cout << "COPY";}
   Cat(Cat&amp;&amp;) {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 :

  • Cela n'empêcherait pas tous les cas de copie involontaire car il est toujours possible que des objets non const n'aient pas de constructeur de déplacement.
  • C'est interférerait avec le code de modèle générique qui utilise intentionnellement le constructeur de copie de secours.
  • Cela limiterait les cas où un constructeur de déplacement à partir d'un objet const pourrait être intentionnellement souhaité.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn