Maison > développement back-end > C++ > Pourquoi ne puis-je pas créer une « std::function » à partir d'un Lambda de capture de mouvement avec un objet non copiable ?

Pourquoi ne puis-je pas créer une « std::function » à partir d'un Lambda de capture de mouvement avec un objet non copiable ?

Linda Hamilton
Libérer: 2024-12-18 13:25:24
original
950 Les gens l'ont consulté

Why Can't I Create an `std::function` from a Move-Capturing Lambda with a Non-Copyable Object?

Création d'une std::fonction à partir d'une expression Lambda de capture de mouvements : dévoilement des limites

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

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

En plongeant dans les subtilités de la classe std::function, nous découvrons le constructeur suivant :

template<class F> function(F f);
Copier après la connexion

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!

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