从函数到函数指针的隐式强制转换

Implicit cast from function to function pointer?

本文关键字:函数 转换 指针      更新时间:2023-10-16

我有一个函数,它接受函数指针作为参数。令人惊讶的是,我可以同时传入函数指针和普通函数:

#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";
}

我对为什么会这样感到困惑。是否存在从函数到函数指针的隐式转换?

是的,有函数到指针的隐式转换:

函数类型 T 的左值可以隐式转换为指向该函数的 prvalue 指针。这不适用于非静态成员函数,因为引用非静态成员函数的 lvalue 不存在。

指向函数的指针可以使用非成员函数或静态成员函数的地址进行初始化。由于函数到指针的隐式转换,地址运算符是可选的:

void f(int);
void (*p1)(int) = &f;
void (*p2)(int) = f; // same as &f

这意味着当在需要函数指针的上下文中使用时,函数(非静态成员函数除外)将隐式转换为函数指针,并且operator&的使用是可选的。