【问题标题】:What causes std::bad_function_call?是什么导致 std::bad_function_call?
【发布时间】:2011-07-30 20:26:12
【问题描述】:

我看到 few questions 引用了 std::bad_function_call exception,但无法通过谷歌搜索找到导致此异常的原因。

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

【问题讨论】:

    标签: c++ exception lambda c++11


    【解决方案1】:

    就我而言,问题出在捕获列表中。我有一个递归 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 中缺少 &amp; 会生成错误调用。

    【讨论】:

      【解决方案2】:

      临时函数的调用也可以抛出:

      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++ 不是)。

      【讨论】:

        【解决方案3】:

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

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

        对我来说没有学分......它是 C++ 标准库的 Nicolai Josuttis Pundit

        【讨论】:

        • 堆栈交换没有采用“”封闭代码! “”代码中的内容不可见。在你用石头砸死我之前......咳咳...... std::function f; f(33,66); // 抛出 std::bad_function_call
        【解决方案4】:

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

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

        【讨论】:

        • 我刚刚进行了搜索,您的示例不仅是最简单的,而且看起来也像 only 示例! :-)
        • @Howard:真的吗?那this answer怎么扔bad_function_call呢?
        • 我最好的猜测是,您引用的答案归结为与 DeadMG 在此处的答案相同的情况:调用空的std::function。抱歉,我目前无法测试 lambda 代码。我仔细检查了最新的 lambda 规范,但我找不到任何抛出 bad_function_call 的东西。我重新搜索了bad_function_call 的最新草案,注意捕捉bad_function_call 可能被连字的情况,但没有发现任何其他情况。仍然有可能我错过了一个。如果您找到它,请为我们发布指向它的指针。
        • @Howard:在考虑之后,我认为该问题中发生的事情是某种奇怪的内存损坏(由悬空引用引起)正在使其中一个 lambdas 看起来像是默认构造。特别是,我认为向量指向其内部存储的指针可能是正在损坏的内存(或者在 for_each 中本地使用的某个迭代器)。
        • 不敢相信这么久了居然没注意到函数的签名错了,rofl。
        猜你喜欢
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-21
        • 1970-01-01
        • 2010-12-31
        • 2013-03-10
        相关资源
        最近更新 更多