Maison >développement back-end >C++ >Pourquoi ma fonction Lambda récursive ne parvient-elle pas à se compiler et comment puis-je y remédier ?

Pourquoi ma fonction Lambda récursive ne parvient-elle pas à se compiler et comment puis-je y remédier ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-13 13:46:11870parcourir

Why Does My Recursive Lambda Function Fail to Compile, and How Can I Fix It?

Résoudre les problèmes de compilation avec les fonctions Lambda récursives

En essayant de définir une fonction lambda récursive, le code suivant ne parvient pas à se compiler :

auto sum = [term,next,&sum](int a, int b)mutable ->int {
  if(a>b)
    return 0;
  else
    return term(a) + sum(next(a),b);
};

L'erreur vient de l'impossibilité d'utiliser "auto" lors de l'initialisation d'une fonction lambda qui se capture. L'inférence de type automatique ne peut pas déterminer le type de retour du lambda, car il dépend de ses variables capturées.

Pour résoudre ce problème, les étapes suivantes peuvent être suivies :

  1. Utiliser un type d'objet de 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);
    };

    La spécification du type d'objet de fonction élimine le besoin de saisie automatique inférence, permettant au compilateur de déterminer le type de retour avec précision.

  2. Initialiser l'objet fonction plus tard :

    std::function<int(int, int)> sum;
    
    sum = [term, next, &amp;sum](int a, int b) -> int {
        if (a > b)
            return 0;
        else
            return term(a) + sum(next(a), b);
    };

    Initialiser l'objet fonction sans une valeur initiale permet au compilateur de déduire son type dans l'instruction d'affectation.

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