递归lambda函数在C 11

我是新到C 11.我编写以下递归lambda函数,但它不编译。

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:在lambda函数中:
sum.cpp:18:36:error:'((< lambda(int,int)> *)this)→< lambda(int,int)> :: sum’

gcc版本

gcc version 4.5.0 20091231(experimental)(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);
};

有人可以点亮这个吗?

考虑自动版本和完全指定的类型版本之间的区别。 auto关键字推断它的类型从它的初始化,但是你正在初始化它需要知道它的类型是什么(在这种情况下,lambda闭包需要知道它捕获的类型)。有鸡和鸡蛋问题。

另一方面,完全指定的函数对象的类型不需要“知道”任何关于被分配给它的什么,因此lambda的闭包同样可以完全知道它捕获的类型。

考虑对你的代码稍作修改,它可能更有意义:

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

显然,这不适用于汽车。递归lambda函数工作得很好(至少他们在MSVC中,我有他们的经验),只是他们不真正与类型推理兼容。

http://stackoverflow.com/questions/2067988/recursive-lambda-functions-in-c11

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:递归lambda函数在C 11