Maison >développement back-end >C++ >Pourquoi les fonctions Lambda récursives échouent-elles avec l'inférence de type automatique en C ?
Fonctions Lambda récursives et inférence de type
Considérez la fonction lambda récursive 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 ne parvient pas à compiler avec l'erreur suivante :
error: ‘`((<lambda(int, int)>*)this)-><lambda(int, int)>::sum`’ cannot be used as a function
Le problème vient de l'utilisation de auto pour déduire le type de la fonction lambda. Lorsque auto est utilisé, le compilateur tente de déduire le type à partir de l’expression d’initialisation. Cependant, dans ce cas, l'expression d'initialisation elle-même doit être consciente du type qu'elle capture, créant ainsi une dépendance circulaire.
Pour résoudre ce problème, on peut utiliser à la place le type d'un objet fonction entièrement spécifié :
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 compilateur n'a pas besoin de déduire le type de fermeture lambda, et le lambda peut être pleinement informé des types dont il s'agit. capture.
Bien que les fonctions lambda récursives puissent fonctionner avec l'inférence de type, cela n'est généralement pas conseillé car cela peut entraîner des problèmes de compilation. Au lieu de cela, spécifier explicitement le type garantit que le compilateur dispose de toutes les informations nécessaires au moment de la compilation.
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!