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
Mary-Kate Olsenoriginal
2024-12-16 17:57:11240parcourir

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

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,&amp;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!

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