[英]unexpected std::bad_function_call in recursion
我已经编写了以下代码,可与function<int(int)>
类型的function<int(int)>
一起使用。 函数compose
, print
, inc
和guarded
是帮助程序,可以组合其他功能或产生一些外部效果。 然后,我用它们来构建我的程序:
/* start of the program */
function<int(int)> recursion();
function<int(int)> go =
compose(guarded(10, recursion()), compose(inc, print("go")));
function<int(int)> recursion() {
return compose(go, print("recursion"));
}
但是,当调用recursion()(0)
,第二次到达go
时引发了std::bad_function_call
异常,但我不知道为什么。 是否有任何悬挂的引用或空的std::function
? 此外,eta扩展go
工作:
function<int(int)> go = [](int n) -> int {
return compose(guarded(10, recursion()), compose(inc, print("go")))(n);
};
原始代码有什么问题? 为什么另选一个有效?
完整代码:
#include <string>
#include <iostream>
#include <functional>
using namespace std;
/* helper functions, some combinators */
//composing two functions, f1 . f2
function<int(int)> compose(const function<int(int)>& f1, const function<int(int)>& f2) {
return [f1,f2](int n) -> int {
return f1(f2(n));
};
}
function<int(int)> print(const string& msg) {
return [msg](int n) -> int {
cout << "print: " << msg << endl;
return n;
};
}
function<int(int)> inc = [](int n) -> int {
cout << "in inc lambda: " << n << endl;
return n+1;
};
//calls the given function `f` only when `n` is less then `m`
function<int(int)> guarded(int m, function<int(int)> f) {
auto g = [m,f](int n) -> int { return n<m? f(n) : m; };
return compose(g, print("guarded"));
}
/* start of the program */
function<int(int)> recursion();
function<int(int)> go =
compose(guarded(10, recursion()), compose(inc, print("go")));
function<int(int)> recursion() {
return compose(go, print("recursion"));
}
int main() {
try {
recursion()(0);
} catch (bad_function_call e) {
cout << "bad_function_call: " << e.what() << endl;
}
return 0;
}
在您的原始代码中,在go
初始化期间调用了recursion()
。 recursion
本身尝试使用go
的值,但是在这一点上, go
尚未初始化,从而导致了问题。
在替代代码中, go
的初始化仅将lambda分配给go
而没有调用recursion
。 稍后调用recursion
, go
已经被初始化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.