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

从重载函数初始化std::function时static_cast转函数指针是否合法?

结论

你写的static_cast<int(*)(int, int)>(Add)写法完全合法可行,不需要必须使用pFnAdd这类具名函数指针传递,两种写法的效果完全等价。

原理说明

当存在重载函数时,直接写函数名Add属于重载集,编译器无法直接从std::function的赋值操作推导要选择哪一个重载版本,所以直接赋值会报歧义错误。
而static_cast会明确指定目标函数指针类型,只要该类型和其中一个重载的签名完全匹配,编译器就会自动选中对应的重载版本,生成对应类型的函数指针临时对象,赋值给std::function的操作完全符合C++标准规范,没有任何安全问题。

写法对比

  • 具名函数指针的写法适合函数签名较长的场景,可读性稍高,不会在一行里塞入过长的类型声明
  • static_cast的写法更简洁,不需要额外定义作用域内的临时指针变量
  • 也可以选择用lambda的写法消除歧义,可读性更直观:
binOps["+"] = [](int a, int b) { return Add(a, b); };

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 16:09:03