Ответы
Q: Что такое лямбда-выражение в C ++ 11?
A: Под капотом это объект автогенерированного класса с оператором перегрузки () Уст. Такой объект называется замыканием и создается компилятором. Эта концепция «закрытия» находится рядом с концепцией связывания с C ++ 11. Но lambdas обычно генерируют лучший код.
В: Когда я буду использовать один?
A: Определить «простую и малую логику» и спросить компилятор выполнить генерацию из предыдущего вопроса. Вы даете компилятору некоторые выражения, которые вы хотите быть внутри оператора ().
Q: Какой класс проблемы они решают, что было невозможно до их введения?
A: Это какой-то синтаксис сахара, как перегрузка операторов вместо функций для пользовательских операций add, subrtact ... Но он сохраняет больше строк ненужного кода, чтобы обернуть 1-3 строки реальной логики для некоторых классов и т. д.! Некоторые инженеры считают, что если число строк меньше, то вероятность ошибок в нем меньше (я тоже так думаю)
Пример использования
auto x = [=](int arg1){printf("%i", arg1); };
void(*f)(int) = x;
f(1);
x(1);
Дополнительные сведения о лямбдах, не затрагиваемые вопросом. Игнорируйте этот раздел, если вы не заинтересованы
1. Захваченные значения. Что вы можете захватить
1.1. Вы можете ссылаться на переменную со статической продолжительностью хранения в lambdas. Все они захвачены.
1.2. Вы можете использовать лямбда для значений захвата «по значению». В этом случае захваченные вары будут скопированы в объект функции (замыкание).
[captureVar1,captureVar2](int arg1){}
1.3. Вы можете захватить ссылку. & Амп; - в этом контексте означают ссылки, а не указатели.
[&captureVar1,&captureVar2](int arg1){}
1.4. Он содержит обозначения для захвата всех нестатических варов по значению или по ссылке
[=](int arg1){} // capture all not-static vars by value
[&](int arg1){} // capture all not-static vars by reference
1.5. Он содержит обозначения для захвата всех нестатических варов по значению или путем ссылки и указания smth. Больше. Примеры: Захват всех нестатических варов по значению, но путем захвата ссылки Param2
[=,&Param2](int arg1){}
Захват всех нестатических варов по ссылке, но с помощью захвата значения Param2
[&,Param2](int arg1){}
2. Вывод типа возврата
2.1. Возвращаемый тип Lambda может быть выведен, если лямбда - это одно выражение. Или вы можете явно указать его.
[=](int arg1)->trailing_return_type{return trailing_return_type();}
Если lambda имеет более одного выражения, тогда возвращаемый тип должен быть указан с помощью возвращаемого типа возврата. Кроме того, подобный синтаксис может применяться к автофункциям и функциям-членам
3. Захваченные значения. Что вы не можете захватить
3.1. Вы можете захватывать только локальные вары, а не переменную-член объекта.
4. Свержения
4.1. lambda не является указателем на функцию и не является анонимной функцией, но может быть неявно преобразован в указатель на функцию.
p.s.
auto toFloat = [](int value) { return float(value);};
auto interpolate = [min = toFloat(0), max = toFloat(255)](int value)->float { return (value - min) / (max - min);};