Maison >développement back-end >C++ >Puis-je créer une « std::function » à 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 :
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!