Выбор между лямбда-классом и функтором является компромиссом.
Выигрыш от лямбды в основном синтаксический, сводя к минимуму количество шаблонного кода и позволяя концептуально связанному коду быть встроенным внутри функции, которая будет его использовать (немедленно или позже).
С точки зрения производительности это не хуже, чем класс функторов , который является структурой или классом C ++, который содержит один «метод». Фактически, компиляторы обрабатывают лямбду не иначе, как сгенерированный компилятором класс функторов за сценой.
// 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);
В вашем примере кода с точки зрения производительности он ничем не отличается от вызова функции, потому что у этого класса функтора нет состояния (поскольку он содержит пустое предложение захвата), поэтому не требуется никакого выделения, конструктора или уничтожения.
int some_computer_generated_gibberish_0123456789_method_more_gibberish(int x)
{
if (...) return ...;
return ...;
}
Отладка любого нетривиального кода C ++ с использованием дизассемблера всегда была сложной задачей. Это верно с использованием лямбды или без нее. Это вызвано сложной оптимизацией кода компилятором C ++, которая привела к переупорядочению, перемежению и удалению мертвого кода.
Аспект искажения имен несколько неприятен, и поддержка лямбды в отладчике все еще находится в зачаточном состоянии . Можно только надеяться, что поддержка отладчика со временем улучшится.
В настоящее время наилучшим способом отладки лямбда-кода является использование отладчика, который поддерживает установку точек останова на уровне исходного кода, т.е. путем указания имени исходного файла и номера строки.