【发布时间】:2011-01-05 07:05:47
【问题描述】:
我是 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: 错误:'((<lambda(int, int)>*)this)-><lambda(int, int)>::sum' 不能用作函数
gcc 版本
gcc 版本 4.5.0 20091231(实验性)(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);
};
有人可以解释一下吗?
【问题讨论】:
-
这可能是静态声明还是隐式动态声明?
-
mutable关键字在那里做什么? -
不允许捕获具有非自动存储持续时间的变量。你应该这样做:chat.stackoverflow.com/transcript/message/39298544#39298544
-
仅供参考,在您的第二个代码 sn-p 中,您的 lambda 过于冗长,请考虑以下更改:
std::function<int(int,int)> sum = [&](int a, int b) { -
如果有人能够回答尾递归优化是否适用于任何解决方案,那将是受欢迎的。