C++中void foo(int(int))与void foo(int(*)(int))是否完全等价?
关于C++中foo函数两个参数声明的区别
首先直接给结论:这两个声明是完全等价的,编译器会把它们当成同一个函数的声明来处理。
为什么会这样?核心原因是C++的一个类型调整规则:当你把函数类型作为函数参数时,编译器会自动将其调整为指向该函数的指针类型。
具体来说:
- 第一个声明
void foo(int(int));里的参数int(int)是一个“接受int参数、返回int的函数类型” - 编译器会自动把这个参数类型转换成“指向接受int参数、返回int的函数的指针”,也就是
int(*)(int),和第二个声明的参数类型完全一致
举个实际调用的例子,不管你用哪种声明,下面的代码都能正常编译运行:
// 定义一个符合参数类型的函数 int bar(int num) { return num + 1; } // 不管foo是哪种声明,这两种调用方式都合法 foo(bar); // 函数名bar会自动退化为函数指针 foo(&bar); // 显式取函数地址,和上面效果一样
这种规则和数组作为函数参数时会自动退化为指针的逻辑很像,都是C++为了简化函数作为参数传递的设计。
内容的提问来源于stack exchange,提问作者lukeg
相关产品推荐
相关产品推荐

