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
Libérer: 2024-12-11 13:46:11
original
1040 Les gens l'ont consulté

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);
Copier après la connexion

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;
};
Copier après la connexion

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);
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal