Maison >développement back-end >C++ >Comment puis-je créer une « std :: fonction » à partir d'un Lambda de capture de mouvements ?

Comment puis-je créer une « std :: fonction » à partir d'un Lambda de capture de mouvements ?

DDD
DDDoriginal
2024-12-24 10:12:37372parcourir

How Can I Create an `std::function` from a Move-Capturing Lambda?

Création d'une fonction std::fonction à partir d'un Lambda de capture de mouvement

Création d'une fonction std::fonction à partir d'un type de déplacement uniquement, tel en tant que lambda de capture de mouvement, peut entraîner des erreurs en raison de la restriction du constructeur de déplacement. Cette restriction découle de la façon dont std::function est défini et construit.

Comprendre le constructeur std::function

Le constructeur std::function peut être appelé dans de deux manières :

  1. std::function(F f);
  2. std::function(allocator_arg_t, const A& a, F f);

Dans les deux cas, le lambda (F) doit être CopyConstructible. Cela signifie que vous ne pouvez pas déplacer le lambda directement dans la fonction std::.

De plus, Operator = est défini en termes de constructeur et de swap, ce qui signifie que les mêmes restrictions s'appliquent.

Conséquences pour les types à déplacement uniquement

Par conséquent, il n'est pas possible de construire une fonction std::à partir d'un lambda de capture de mouvements qui capture un type de déplacement uniquement. Tenter de le faire entraînera une erreur de compilation en raison du constructeur de copie supprimé implicitement.

Solution alternative

Pour contourner ce problème, vous pouvez utiliser un shared_ptr pour envelopper le type de déplacement uniquement, puis capturer le shared_ptr dans votre lambda. Le shared_ptr garantira que le type est copiable, vous permettant de créer une fonction std::à partir du lambda.

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