我有一个函数,它接受函数指针作为参数。令人惊讶的是,我可以同时传入一个函数指针和一个普通函数:
#include <iostream>
#include <functional>
int triple(int a) {
return 3*a;
}
int apply(int (*f)(int), int n) {
return f(n);
}
int main() {
std::cout << apply(triple, 7) << "\n";
std::cout << apply(&triple, 7) << "\n";
}
我对为什么这样做感到困惑。是否存在从函数到函数指针的隐式转换?
答案 0 :(得分:4)
是的,有function-to-pointer implicit conversion:
可以将函数类型T的左值隐式转换为prvalue pointer to that function。这不适用于非静态成员函数,因为引用非静态成员函数的左值不存在。
和
可以使用非成员函数或静态成员函数的地址来初始化指向函数的指针。由于函数到指针的隐式转换,address-of运算符是可选的:
void f(int); void (*p1)(int) = &f; void (*p2)(int) = f; // same as &f
这意味着,当在需要函数指针的上下文中使用函数时,函数(非静态成员函数除外)将隐式转换为函数指针,并且operator&
的使用是可选的。