Maison >développement back-end >C++ >Pourquoi une fonction Lambda récursive échoue-t-elle avec « auto » mais réussit-elle avec un type entièrement spécifié ?
Fonction Lambda récursive avec Auto
Lorsque vous essayez de définir une fonction lambda récursive à l'aide du mot-clé auto, vous pouvez rencontrer des erreurs de compilation. Par exemple, considérons la fonction lambda suivante :
auto sum = [term, next, &sum](int a, int b)mutable ->int { if(a>b) return 0; else return term(a) + sum(next(a),b); };
Ce code entraînera l'erreur suivante :
error: ‘`((<lambda(int, int)>*)this)-><lambda(int, int)>::sum`’ cannot be used as a function
Comprendre le problème
Le problème se pose car le mot-clé auto déduit le type de la fonction lambda à partir de son initialisation. Cependant, pour une fonction lambda récursive, la fermeture lambda doit connaître les types qu'elle capture, ce qui est un problème de poule et d'œuf.
Solution : utiliser un type entièrement spécifié
Pour résoudre ce problème, vous pouvez spécifier explicitement le type de la fonction lambda à l'aide d'un objet std::function. Par exemple :
std::function<int(int,int)> sum = [term,next,&sum](int a, int b)->int { if(a>b) return 0; else return term(a) + sum(next(a),b); };
Dans ce cas, le type de la fonction lambda est entièrement spécifié, de sorte que la fermeture lambda peut être pleinement informée des types qu'elle capture.
Auto vs. Type entièrement spécifié
Les fonctions lambda récursives sont compatibles avec les types entièrement spécifiés mais pas avec l'inférence de type utilisant auto. En effet, auto nécessite que l'initialisation ait un type connu, alors qu'un type entièrement spécifié ne nécessite pas cette connaissance.
En spécifiant explicitement le type de votre fonction lambda récursive, vous pouvez éviter les erreurs de compilation et vous assurer que le la fermeture lambda est correctement informée des types qu'elle capture.
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!