В коде, который вы разместили:
std::function<int(int)> meta_add(int x) {
auto add = [x](int y) { return x + y; };
return add;
}
Объект std::function<int(int)>
, возвращаемый функцией, фактически содержит перемещенный экземпляр объекта лямбда-функции, который был присвоен локальной переменной add
.
Когда вы определяете лямбду C ++ 11, которая захватывает по значению или по ссылке, компилятор C ++ автоматически генерирует уникальный функциональный тип, экземпляр которого создается, когда лямбда вызывается или назначается переменной. Чтобы проиллюстрировать это, ваш компилятор C ++ может сгенерировать следующий тип класса для лямбды, определяемой [x](int y) { return x + y; }
:
class __lambda_373s27a
{
int x;
public:
__lambda_373s27a(int x_)
: x(x_)
{
}
int operator()(int y) const {
return x + y;
}
};
Тогда функция meta_add
по существу эквивалентна:
std::function<int(int)> meta_add(int x) {
__lambda_373s27a add = __lambda_373s27a(x);
return add;
}
РЕДАКТИРОВАТЬ: Кстати, я не уверен, если вы знаете это, но это пример функции curry в C ++ 11.