A escolha entre lambda e functor-class é uma troca.
O ganho do lambda é principalmente sintático, minimizando a quantidade de clichê e permitindo que o código conceitualmente relacionado seja escrito em linha, dentro da função que o utilizará (imediatamente ou mais tarde).
Em termos de desempenho, isso não é pior do que uma classe functor , que é uma estrutura ou classe C ++ que contém um único "método". De fato, os compiladores tratam o lambda de maneira diferente da classe de functor gerada por compilador nos bastidores.
// 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);
No seu exemplo de código, em termos de desempenho, não é diferente de uma chamada de função, porque essa classe de functor não possui estado (porque possui uma cláusula de captura vazia), exigindo, portanto, nenhuma alocação, construtor ou destruição.
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
Depurar qualquer código C ++ não trivial usando um desmontador sempre foi uma tarefa difícil. Isso é verdade com ou sem o uso de lambda. Isso é causado pela sofisticada otimização de código do compilador C ++, que resultou na reordenação, intercalação e eliminação de código morto.
O aspecto de desconfiança de nomes é um pouco desagradável, e o suporte ao depurador para lambda ainda está em sua infância . Só podemos esperar que o suporte ao depurador melhore com o tempo.
Atualmente, a melhor maneira de depurar o código lambda é usar um depurador que suporte a configuração de pontos de interrupção no nível do código-fonte, ou seja, especificando o nome do arquivo de origem e o número da linha.