Maison >développement back-end >C++ >Puis-je créer une « std::function » à partir d'une expression Lambda de capture de mouvement ?

Puis-je créer une « std::function » à partir d'une expression Lambda de capture de mouvement ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-11 13:46:11973parcourir

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

Création d'une fonction std::à partir d'une expression lambda de capture de mouvement

Il est possible de construire une fonction std::à partir d'une expression lambda de capture de mouvement ; cependant, certaines restrictions s'appliquent.

Constructeur de modèle

Une fonction std::peut être construite à partir d'un lambda de capture de mouvement à l'aide du constructeur de modèle suivant :

template<class F>
function(F f);

Exigences

Pour que ce constructeur fonctionne, les exigences suivantes doivent être remplies :

  • La capture de l'expression lambda doit être constructible par copie.
  • L'expression lambda doit être appelable avec les types d'arguments et le type de retour spécifiés.
  • Le constructeur et le destructeur de copie de la capture lambda ne doivent pas lancer exceptions.

Types de déplacement uniquement

Il n'est pas possible de construire une fonction std::à partir d'un lambda qui bouge- capture un type de déplacement uniquement. En effet, le constructeur de copie et l'opérateur d'affectation de std::function sont définis en termes d'un constructeur qui nécessite des types constructibles par copie.

Exemple

Considérez l'extrait de code suivant :

auto pi = std::make_unique<int>(0);

// Move-capturing lambda
auto foo = [q = std::move(pi)] {
    *q = 5;
    std::cout << *q << std::endl;
};

Tentative de créer une fonction std::à partir de ce lambda en utilisant l'une des approches suivantes entraînera une erreur de compilation :

std::function<void()> bar = foo;
std::function<void()> bar{foo};
std::function<void()> bar{std::move(foo)};
std::function<void()> bar = std::move(foo);
std::function<void()> bar{std::forward<std::function<void()>>(foo)};
std::function<void()> bar = std::forward<std::function<void()>>(foo);

Cela est dû au fait que pi est un type de déplacement uniquement et que le constructeur de copie de std::function nécessite des types constructibles par copie.

Par conséquent, si vous souhaitez utiliser un lambda de capture de mouvement avec std::function, assurez-vous que sa capture est constructible par copie.

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