递归中的std::bad_function_call异常

unexpected std::bad_function_call in recursion

本文关键字:function call 异常 bad std 递归      更新时间:2023-10-16

我编写了下面的代码,它使用类型为function<int(int)>的函数。函数composeprintincguarded是辅助函数,它们与其他函数结合或产生一定的外部效应。然后我用它们来构建我的程序:

/* 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将已经初始化。

相关文章: