La elección entre lambda y functor-class es una compensación.
La ganancia de lambda es principalmente sintáctica, al minimizar la cantidad de repeticiones y permitir que el código relacionado conceptualmente se escriba en línea, dentro de la función que lo va a utilizar (inmediatamente o más tarde).
En cuanto al rendimiento, esto no es peor que una clase functor , que es una estructura o clase C ++ que contiene un solo "método". De hecho, los compiladores tratan la lambda de manera diferente a una clase de functor generada por el compilador detrás de escena.
// 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);
En su ejemplo de código, en cuanto al rendimiento, no es diferente de una llamada de función, porque esa clase de functor no tiene estado (porque tiene una cláusula de captura vacía), por lo que no requiere asignación, constructor ni destrucción.
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
La depuración de cualquier código C ++ no trivial utilizando un desensamblador siempre ha sido una tarea difícil. Esto es cierto con o sin usar lambda. Esto es causado por la sofisticada optimización de código del compilador de C ++ que resultó en la reordenación, intercalación y eliminación de código muerto.
El aspecto de cambio de nombre es algo desagradable, y el soporte del depurador para lambda todavía está en pañales . Solo se puede esperar que el soporte del depurador mejore con el tiempo.
Actualmente, la mejor manera de depurar el código lambda es utilizar un depurador que admita establecer puntos de interrupción en el nivel del código fuente, es decir, especificando el nombre del archivo fuente y el número de línea.