递归中的std::bad_function_call异常
unexpected std::bad_function_call in recursion
我编写了下面的代码,它使用类型为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;
}
在原始代码中,recursion()
在go
初始化期间被调用。recursion
本身试图使用go
的值,但此时go
尚未初始化,导致问题。
在替代代码中,go
的初始化只给go
分配一个lambda,而不调用recursion
。当稍后调用recursion
时,go
将已经初始化。
相关文章:
- 编译时二叉搜索树错误的反向迭代器表示"no matching function call for operator=()"
- std::<int>betterer() 比较器与 partial_copy_sort 的困难,在 Mac OSX 上"no matching function call.."
- GCC 和 clang 抛出"no matching function call"但 msvc (cl) 按预期编译和工作
- 将 lambda 传递给 STL 集时出错"bad function call"
- 如何在迭代流缓冲区时摆脱无"matching function call error"?
- 为什么这句话"The expression can be used only as the left-hand operand of a member function call"在 [expr.re
- 内核调用会产生错误"error: a host function call cannot be configured"。调用有什么问题?
- 运算符中的"With respect to an indeterminately-sequenced function call"
- "no matching function call..." 此错误来自哪里,我该如何解决?
- 虚假"missing sentinel in function call"
- 当我尝试将新节点添加到列表中时,我收到错误消息"no matching function call"
- 尝试调用构造函数,收到"no matching function call"编译错误
- 避免派生类C++中的"Pure Virtual Function Call"
- "Function call missing argument list" ?
- boost::asio::d eadline_timer 导致"a function call cannot appear in a constant-expression"错误
- 如何修复("too few arguments in function call")?
- 初C++,构造函数"no matching function call to"
- 如何解决错误说"No matching function call for XXX"?
- "no matching function call"模板化函数项目
- 标准中关于"virtual function call in base constructor"的部分在哪里