You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:54:29