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
Linda Hamiltonoriginal
2024-12-18 13:25:24890parcourir

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;
};

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!

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