Рекурсивная лямбда функционирует в C++ 11

Я плохо знаком с C++ 11. Я пишу следующую рекурсивную функцию лямбды, но она не компилирует.

sum.cpp

#include <iostream>
#include <functional>

auto term = [](int a)->int {
  return a*a;
};

auto next = [](int a)->int {
  return ++a;
};

auto sum = [term,next,&sum](int a, int b)mutable ->int {
  if(a>b)
    return 0;
  else
    return term(a) + sum(next(a),b);
};

int main(){
  std::cout<<sum(1,10)<<std::endl;
  return 0;
}

ошибка компиляции:

vimal@linux-718q: ~/Study/09C ++/c ++ 0x/lambda> g ++-std=c ++ 0x sum.cpp

sum.cpp: В функции лямбды: сумма cpp:18:36: ошибка:‘((<lambda(int, int)>*)this)-><lambda(int, int)>::sum’не может использоваться в качестве функции

версия gcc

версия 4.5.0 20091231 gcc (экспериментальная) (GCC)

Но если я изменяю объявление sum() как ниже, это работает:

std::function<int(int,int)> sum = [term,next,&sum](int a, int b)->int {
   if(a>b)
     return 0;
   else
     return term(a) + sum(next(a),b);
};

Кто-то мог пролить свет на это?

127
задан Eliad 3 July 2016 в 17:42
поделиться

1 ответ

Вы пытаетесь захватить переменную (сумму), вы находитесь в середине определения. Это не может быть хорошим.

Я не думаю, возможно, возможны действительно саморекурсивный C ++ 0x лямбдас. Вы должны быть в состоянии захватить другие лямбда, хотя.

-2
ответ дан 24 November 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: