簡體   English   中英

意外的std :: bad_function_call遞歸

[英]unexpected std::bad_function_call in recursion

我已經編寫了以下代碼,可與function<int(int)>類型的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;
}

在您的原始代碼中,在go初始化期間調用了recursion() recursion本身嘗試使用go的值,但是在這一點上, go尚未初始化,從而導致了問題。

在替代代碼中, go的初始化僅將lambda分配給go而沒有調用recursion 稍后調用recursiongo已經被初始化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM