Le choix entre lambda et functor-class est un compromis.
Le gain de lambda est principalement syntaxique, en minimisant la quantité de passe-partout et en permettant l'écriture de code conceptuel en ligne, à l'intérieur de la fonction qui va l'utiliser (immédiatement ou plus tard).
En termes de performances, ce n'est pas pire qu'une classe functor , qui est une structure ou une classe C ++ qui contient une seule "méthode". En fait, les compilateurs ne traitent pas lambda différemment d'une classe de foncteurs générée par le compilateur derrière la scène.
// define the functor method somewhere
struct some_computer_generated_gibberish_0123456789
{
int operator() (int x) const
{
if (x == 2) return 5;
if (x == 3) return 6;
return 0;
}
};
// make a call
some_computer_generated_gibberish_0123456789 an_instance_of_0123456789;
int outputValue = an_instance_of_0123456789(inputValue);
Dans votre exemple de code, en termes de performances, il n'est pas différent d'un appel de fonction, car cette classe de fonctor n'a aucun état (car elle a une clause de capture vide), ne nécessitant ainsi aucune allocation, constructeur ou destruction.
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
Le débogage de tout code C ++ non trivial à l'aide d'un désassembleur a toujours été une tâche difficile. Cela est vrai avec ou sans utilisation de lambda. Cela est dû à l'optimisation sophistiquée du code par le compilateur C ++ qui a entraîné la réorganisation, l'entrelacement et l'élimination du code mort.
L'aspect de manipulation de nom est quelque peu désagréable, et le support du débogueur pour lambda est encore à ses balbutiements . On ne peut qu'espérer que le support du débogueur s'améliorera avec le temps.
Actuellement, la meilleure façon de déboguer du code lambda est d'utiliser un débogueur qui prend en charge la définition de points d'arrêt au niveau du code source, c'est-à-dire en spécifiant le nom du fichier source et le numéro de ligne.