gpt4 book ai didi

c++ - 递归中意外的 std::bad_function_call

转载 作者:行者123 更新时间:2023-11-30 00:53:17 25 4
gpt4 key购买 nike

我写了下面的代码,它使用了 function<int(int)> 类型的函数。 .函数compose , print , incguarded是结合其他功能或产生某些外部效果的助手。然后我用它们来构建我的程序:

/* 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) 时, 一个异常(exception) std::bad_function_callgo 时被抛出第二次到达,但我不明白为什么。是否有任何悬挂引用或空的 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 的初始化只分配了一个lambda 给go,而没有调用递归。稍后调用recursion时,go已经初始化。

关于c++ - 递归中意外的 std::bad_function_call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16775724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com