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

Pourquoi ne puis-je pas créer une fonction std::à partir d'un Lambda de capture de mouvements ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-13 10:10:11118parcourir

Why Can't I Create an std::function from a Move-Capturing Lambda?

Construction d'une fonction std::à partir d'une expression lambda de capture de mouvements

Vous pouvez rencontrer des difficultés lorsque vous tentez de créer une fonction std::à partir d'une expression lambda de capture de mouvements , bien que je n'aie aucun problème à créer le lambda lui-même. Cela est dû aux restrictions imposées par le constructeur std::function et son opérateur d'affectation.

Le constructeur std::function et Operator= exigent que l'argument soit CopyConstructible. Cependant, un lambda de capture de mouvement qui capture un type de déplacement uniquement (tel qu'un std::unique_ptr) ne peut pas être CopyConstructible.

Pour clarifier, la capture de mouvement fait référence au mécanisme de capture utilisé par les expressions lambda. Contrairement à la capture par copie, qui crée une copie de la variable capturée, la capture par déplacement transfère la propriété de la variable au lambda.

Le code que vous avez fourni illustre le problème :

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

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

std::function<void()> bar = foo; // Error: attempts to copy-construct 'foo'

L'expression lambda 'foo' capture le pointeur unique 'pi' par déplacement, ce qui en fait un type de déplacement uniquement. Par conséquent, construire une fonction std::à partir de 'foo' n'est pas possible car 'foo' ne peut pas être copié.

Pour contourner cette limitation, envisagez des approches alternatives, telles que l'utilisation de std::bind ou la création d'une classe wrapper. qui encapsule le lambda et fournit une interface CopyConstructible.

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