是什么导致了 std::bad_function_call?

发布于 2024-10-30 13:06:02 字数 449 浏览 1 评论 0原文

我见过很少 问题引用std::bad_function_call 异常,但一直无法通过谷歌搜索找出导致此异常的原因。

什么样的行为会导致此异常?你能给我一些没有其他语义问题的最小例子吗?

I've seen a few questions that refer to the std::bad_function_call exception, but haven't been able to find out any by Googling about what causes this exception.

What kind of behavior is supposed to cause this exception? Can you give me minimal examples that don't have other semantic problems also going on?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

谜兔 2024-11-06 13:06:02

当然 - 最简单的方法是尝试调用空的 std::function

int main() {
    std::function<int()> intfunc;
    int x = intfunc(); // BAD
}

Sure- the easiest is where you try to call a std::function that's empty.

int main() {
    std::function<int()> intfunc;
    int x = intfunc(); // BAD
}
赢得她心 2024-11-06 13:06:02

就我而言,问题出在捕获列表中。我有一个递归 lambda 函数。

//decl
std::function<void(const SBone*, const core::vector3df&, const core::quaternion&)> f_build;
f_build = [&f_build](const SBone* bone, const core::vector3df& pos, const core::quaternion& rot)
{
...
}

捕获列表中 f_build 中缺少 & 会生成错误的调用。

In my case, the problem was in the capture list. I have a recursive lambda function.

//decl
std::function<void(const SBone*, const core::vector3df&, const core::quaternion&)> f_build;
f_build = [&f_build](const SBone* bone, const core::vector3df& pos, const core::quaternion& rot)
{
...
}

Missing & from f_build in the capture list generates a bad call.

朕就是辣么酷 2024-11-06 13:06:02

“在没有调用目标的情况下执行函数调用会引发以下类型的异常
std::bad_function_call"

    std::function<void(int,int)> f;
    f(33,66); // throws std::bad_function_call

不属于我......其 C++ 标准库的 Nicolai Josuttis Pundit

"Performing a function call without having a target to call throws an exception of type
std::bad_function_call"

    std::function<void(int,int)> f;
    f(33,66); // throws std::bad_function_call

No credits to me....its Nicolai Josuttis Pundit of C++ Standard Lib

又爬满兰若 2024-11-06 13:06:02

调用临时函数也可能抛出:

struct F
{
    const std::function<void()>& myF;

    F(const std::function<void()>& f) : myF(f) {}

    void call()
    {
        myF();
    }
};

int main()
{
    F f([]{ std::cout << "Hello World!" << std::endl;});

    f.call();

    return 0;
}

但这取决于编译器(vc++ 抛出,g++ 不会)。

Call of a temporary function also can throw:

struct F
{
    const std::function<void()>& myF;

    F(const std::function<void()>& f) : myF(f) {}

    void call()
    {
        myF();
    }
};

int main()
{
    F f([]{ std::cout << "Hello World!" << std::endl;});

    f.call();

    return 0;
}

But this depend on compiler (vc++ throws, g++ not).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文