Dans le domaine du C, la tâche de construction d'une std::fonction d'une expression lambda de capture de mouvement surgit souvent. Bien que les expressions lambda de capture de mouvements elles-mêmes puissent être créées de manière transparente, l'énigme réside dans l'incapacité de les encapsuler dans une fonction std::.
Comme notre exemple l'illustre :
auto pi = std::make_unique<int>(0); auto foo = [q = std::move(pi)] { *q = 5; std::cout << *q << std::endl; };
Cet exemple construit sans effort une expression lambda de capture de mouvements sans rencontrer d'obstacles. Cependant, lorsque nous essayons d'intégrer ce lambda dans une std::function, nous rencontrons un barrage d'erreurs :
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);
En plongeant dans les subtilités de la classe std::function, nous découvrons le constructeur suivant :
template<class F> function(F f);
Ce constructeur dévoile le problème sous-jacent : il nécessite que la fonction F encapsulée soit constructible par copie. Cependant, notre expression lambda de capture de mouvements ne répond pas à ce critère ; au lieu de cela, il capture un objet non constructible par copie.
Par conséquent, nous concluons que même si la construction d'une fonction std::à partir d'une expression lambda de capture de mouvement est réalisable, elle se heurte à un obstacle insurmontable lorsque le lambda move-capture un objet non constructible par copie. Dans de tels scénarios, des approches alternatives, telles que l'idiome « release/acquire-in-lambda », deviennent nécessaires.
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!