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

C++:std::function赋值函数名与取函数地址的区别究竟是什么?

关于std::function赋值函数名与函数指针的区别

结论先行:fn1和fn2在功能、底层实现上完全没有区别

核心原因:

  • 在C++中,函数名(比如half)出现在表达式语境中时,会自动隐式转换为指向该函数的指针,和显式使用&half取地址得到的是同一个指针值。
  • 不存在“复制函数half”的说法——函数是程序代码段中的只读实体,根本无法被复制。std::function在这里存储的都是指向half的函数指针,两者指向的是同一个函数入口。

对注释的解释:

Cplusplus.com的注释只是形式上的区分:一个是直接使用函数名的写法,一个是显式取函数指针的写法,但这两种写法最终传递给std::function构造函数的参数是完全等价的。

验证代码:

可以通过std::function::target()方法获取存储的指针,验证两者指向同一目标:

#include <iostream>
#include <functional>

int half(int x) {return x/2;}

int main () {
  std::function<int(int)> fn1 = half;
  std::function<int(int)> fn2 = &half;

  // 获取存储的函数指针
  const int(*p1)(int) = fn1.target<int(*)(int)>();
  const int(*p2)(int) = fn2.target<int(*)(int)>();

  std::cout << (p1 == p2) << '\n'; // 输出1,表示两个指针完全相同
  return 0;
}

总结:

视频里的说法是正确的——&运算符在这里确实是可选的,两种写法没有任何功能差异,只是语法风格不同而已。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 04:53:28