C++中是否存在从函数指针到函数的隐式转换?
澄清C++函数指针的常见混淆点
我发布此文主要是为了澄清Stack Overflow上遇到的一些关于函数指针的易混淆、误导性信息。
我们从一个示例开始:
#include <iostream> void func () { std::cout<<"func here"<<'\n'; } int main() { void (*fp)()=func; void (&fref)()=func; func();//通过函数调用 (&func)();//通过函数指针调用 (*fp)();//通过函数调用 fp();//通过函数指针调用 fref();//通过函数调用 (&fref)();//通过函数指针调用 }
运行后输出:
func here func here func here func here func here func here
可以看到,得益于函数到函数指针的退化,函数大多时候可以替代函数指针使用,cppreference中的说明如下:
函数类型T的左值可隐式转换为指向该函数的纯右值指针。此转换不适用于非静态成员函数,因为不存在引用非静态成员函数的左值。
但除此之外,函数指针似乎也可以替代函数使用——调用时无需显式解引用即可执行函数。
此外,Stack Overflow上的回答提到:
还要注意,通过函数指针调用时不需要使用一元
*运算符;(*p1_foo)();和(p1_foo)();结果相同,同样是因为函数到函数指针的转换。
另一篇Stack Overflow回答则表示:
还有一种对称的便利性:处于调用位置的函数指针会自动转换为函数值,因此调用函数指针时不需要写
*。
这些内容似乎表明,存在从函数指针到函数的隐式转换。
内容的提问来源于stack exchange,提问作者Aiko
相关产品推荐
相关产品推荐

