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é ?

Pourquoi une fonction Lambda récursive échoue-t-elle avec « auto » mais réussit-elle avec un type entièrement spécifié ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-14 21:39:16628parcourir

Why Does a Recursive Lambda Function Fail with `auto` but Succeed with a Fully Specified Type?

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

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