Maison > développement back-end > C++ > Pourquoi les fonctions Lambda récursives échouent-elles avec l'inférence de type automatique en C ?

Pourquoi les fonctions Lambda récursives échouent-elles avec l'inférence de type automatique en C ?

Mary-Kate Olsen
Libérer: 2024-12-16 17:57:11
original
238 Les gens l'ont consulté

Why Do Recursive Lambda Functions Fail with Auto Type Inference in 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);
};
Copier après la connexion

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

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,&amp;sum](int a, int b)->int {
   if(a>b)
     return 0;
   else
     return term(a) + sum(next(a),b);
};
Copier après la connexion

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!

source:php.cn
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