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 = ½ // 获取存储的函数指针 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
相关产品推荐
相关产品推荐

