Ответ 1
Поскольку выражение лямбда - это функция основного языка, предоставляемая компилятором. std::function
- это функция библиотеки, реализованная в коде. Обратите внимание, что вам не нужно включать ничего для хранения лямбда в переменной.
auto f = [](int x, int y){ return x < y; };
Вам нужно включить <functional>
, если вы планируете сохранить его в std::function
(потому что там, где он был реализован).
У вас, похоже, создается впечатление, что тип лямбда - это std::function
. Это не. Каждое выражение лямбда имеет свой уникальный, неподдающийся виду тип. Я взял этот тип выше, с auto
. std::function
- более общий тип, который может хранить любой объект, подобный функции, с соответствующей сигнатурой. Например, я могу создать объект std::function<int(int,int)>
и назначить ему нормальную функцию, объект функции и лямбда.
#include <functional>
int minus_func(int a, int b) { return a - b; }
struct plus_t {
int operator()(int a, int b) const { return a + b; }
};
int main() {
auto mult_lambda = [](int a, int b) { return a * b; };
std::function<int(int,int)> func;
func = minus_func;
func = plus_t{};
func = mult_lambda;
}
Там также есть стоимость этой общности, в виде динамического распределения и косвенности. В то время как использование лямбда через переменную ее фактического типа очень часто встраивается.