Принимая во внимание, что лямбда-вызов похож на функцию, лямбда больше похож на функтор структуры / класса, но в действительности не имеет собственной ссылки с this
:
struct Lambda
{
constexpr int operator()(int i) const {
if (i<3) return i;
else return test(i-1); // Cannot access to variable test
// No this equivalent for lambda
}
};
std::function<int(int)> test = Lamdba{};
С захватом ([&]
) , это становится:
struct Lambda
{
std::function<int(int)>& test;
constexpr int operator()(int i) const {
if (i<3) return i;
else return test(i-1); // The captured std::function,
// not necessary related to this instance
}
};
std::function<int(int)> test = Lamdba{test};
this
в лямбда-выражении, ссылается на класс экземпляра, включающий лямбду, (если есть).
Возможный способ обработки рекурсии с помощью lamdba (без ее преобразования) в std :: function) это Y-комбинатор, что-то вроде
auto f = [](auto f, int i){
if (i<3) return i;
else return f(i-1); // The parameter which is expected to be the lambda
};
auto test = [f](int) { return f(t, i); };
auto res = test(42);