Вибір між лямбда-класом та класом функторів - це компроміс.
Виграш від лямбда здебільшого синтаксичний, мінімізуючи кількість котлоавтомобілів та дозволяючи записати концептуально пов'язаний код всередині функції, яка буде використовувати його (негайно чи пізніше).
Це означає, що це не гірше, ніж клас функторів , який є структурою або класом 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 ++, що призвело до переупорядкування, переплетення та усунення мертвого коду.
Аспект керування іменами дещо непримітний, і підтримка налагодження лямбда ще знаходиться в зародковому стані . Можна лише сподіватися, що з часом покращиться підтримка налагоджувача.
В даний час найкращим способом налагодження лямбда-коду є використання налагоджувача, який підтримує встановлення точок прориву на рівні вихідного коду, тобто шляхом зазначення імені вихідного файлу та номера рядка.