Création de std::function à partir d'expressions Lambda Move-Capturing
Comprendre le problème de la création d'objets std::function à partir d'expressions lambda est crucial . Il est possible de créer des expressions lambda avec move capture, mais lorsque vous tentez de les encapsuler dans std::function, des erreurs peuvent survenir.
Exemples d'erreurs
Plusieurs tentatives de convertir un lambda de capture de mouvement en std::function conduit systématiquement à l'erreur "Appel au constructeur de copie implicitement supprimé de ' La nécessité de Lambdas de capture de déplacement La capture de déplacement dans les expressions lambda devient nécessaire dans les scénarios où le partage de la propriété d'un objet est non viable, comme dans les bibliothèques d'interface utilisateur personnalisées. Ces bibliothèques proposent des méthodes comme on_mouse_down() et push_undo_action() pour enregistrer les gestionnaires d'événements à l'aide de std::function. Pour garantir une propriété efficace des ressources, la capture de déplacement dans les expressions lambda est préférée à l'idiome précédent et encombrant de « libération/acquisition-dans-lambda ». Restrictions sur la construction std::function Le constructeur std::function pour spécifier directement un objet fonction a les éléments suivants signature : Ces garanties incluent les éléments suivants : Applicabilité à Move-Capture While expressions lambda avec move capture ne viole pas l'exigence de copiabilité de F, ils sont souvent des types de capture de mouvement (tels que std::unique_ptr) qui ne fournissent pas le constructeur de copie requis. En conséquence, la construction de std::function à partir de ces lambdas de capture de mouvements devient irréalisable. Conclusion Il est important de noter que la conversion de move- la capture de lambdas dans std::function n'est pas possible en raison des limitations du constructeur std::function dans la gestion des types de déplacement uniquement. Cette restriction découle de la nécessité de std::function de conserver une copie de l'objet fonction encapsulé. 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!template <class F> function(F f);</p>
<p>Cependant, un autre constructeur associé accepte un allocateur et une référence à un type qui fournit certaines garanties :</p>
<pre class="brush:php;toolbar:false">template <class F, class A> function(allocator_arg_t, const A& a, F f);