我是C++ 11的新手.我正在编写以下递归lambda函数,但它不编译.
#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;
}
Run Code Online (Sandbox Code Playgroud)
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版本4.5.0 20091231(实验性)(GCC)
但如果我改变sum()下面的声明,它的作用是:
std::function<int(int,int)> sum = [term,next,&sum](int a, …Run Code Online (Sandbox Code Playgroud) 使用一些Hindley-Milner类型推断变体的编程语言可以很容易地推断出表达式的类型,例如
let rec fix f x = f (fix f) x
Run Code Online (Sandbox Code Playgroud)
而C++ 1y中的返回类型推断因以下原因而失败:
int main() {
auto fix =
[&](auto f) {
return [&](auto x) {
return f(fix(f))(x);
};
};
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用clang 3.5和命令试了这个
clang++ -std=c++1y fix.cc
Run Code Online (Sandbox Code Playgroud)
我明白了
fix.cc:7:18: error: variable 'fix' declared with 'auto' type cannot appear in its
own initializer
return f(fix(f))(x);
Run Code Online (Sandbox Code Playgroud)
C++的返回类型推断中缺少什么,当必须推断返回类型时,它不允许在它自己的初始化器中使用变量?我可以做些什么来解决这个问题,更好的是,我们可以做些什么来解决这个问题?