You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何调用返回函数指针的函数?显式解引用编译报错问题

问题解析:为什么std::function不能用显式解引用调用

你的问题核心在于**std::function是一个函数对象(functor),而非原始函数指针**,两者的操作支持存在本质差异:

  • passFunction()返回的是std::function<int(int, int)>类型的实例,这个类模板仅重载了operator()来实现函数调用行为,所以直接写passFunction()(a, b)是合法的——本质是调用std::function的operator()成员函数。
  • 但std::function并没有重载operator*,因此你尝试*passFunction()时,编译器找不到匹配的解引用运算符,自然抛出no operator "*" matches these operands的错误。

如果是原始函数指针(比如把passFunction的返回类型改为int(*)(int, int)),(*passFunction())(a, b)完全合法——C++允许对函数指针进行解引用操作,甚至多次解引用(如(**passFunction())(a, b))也能正常编译,这是C语言遗留的特性。

解决方式

不需要强行使用显式解引用,直接写passFunction()(a, b)即可,这是std::function的标准调用方式。如果一定要模拟函数指针的解引用写法,可以先将std::function转换为对应函数指针:

int main()
{
    int a{ 1 };
    int b{ 2 };
    // 转换为函数指针
    int(*fp)(int, int) = passFunction();
    std::cout << (*fp)(a, b); // 此时解引用合法
    return 0;
}

不过这种写法属于画蛇添足,直接调用std::function的operator()是最简洁规范的做法。

内容的提问来源于stack exchange,提问作者kvrier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 20:25:29