微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++11 中的递归 lambda 函数

如何解决C++11 中的递归 lambda 函数

想想 版本和完全指定的类型版本之间的区别。 关键字从它初始化的任何东西中推断出它的类型,但是你初始化它的东西需要知道它的类型是什么(在这种情况下,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 中运行良好,我有使用它们的经验),只是它们与类型推断并不真正兼容。

解决方法

我是 C++11 的新手。我正在编写以下递归 lambda 函数,但它无法编译。

总和.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/c0x/lambda> g -std=c0x sum.cpp

sum.cpp:在 lambda 函数中:sum.cpp:18:36: 错误:“ ((<lambda(int,int)>*)this)-><lambda(int,int)>::sum”不能作为函数使用

gcc 版本

gcc 版本 4.5.0 20091231(实验性)(GCC)

但是,如果我更改如下声明sum(),它将起作用:

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

有人可以解释一下吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。