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

C++函数作为参数传递的特殊写法及底层原理疑问

void printA()
{
   cout << "A\n";
}

void print1( void (*func_ptr)(void) )
{
   func_ptr();
}

void print2( void func(void))
{
   func();
}

int main()
{
  //Method 1a (传入函数指针)
  print1(&printA);
  //Method 1b (未传入引用或指针为何可以正常运行?)
  print1(printA);

  //Method 2 (是否传入整个函数的副本?)
  print2(printA);

  return 0;
}

问题1解答

C++标准规定函数类型的左值可以隐式转换为指向该函数的指针。printA本身是函数类型的标识符,你没有手动加&取地址的时候,编译器会自动完成隐式转换,生成的函数指针和&printA完全等价,自然可以匹配print1的void(*)(void)形参类型,不会编译报错。

问题2解答

不会存在函数副本按值传递的情况。这是C/C的固有语法规则:所有声明为函数类型的形参,都会被编译器自动调整为对应的函数指针类型。你写的void print2( void func(void) )和void print2( void (*func)(void) )是完全等价的定义。而且C中函数本身是不可复制、不可移动的类型,根本不存在按值传递的可能性,实际传入的还是隐式转换后的printA函数指针。

问题3解答

函数标识符本身不属于引用类型,它是函数左值,类型就是对应的函数类型本身,既不是指针也不是引用。只是因为存在函数类型隐式转函数指针的规则,才会让它在使用时看起来和指针行为高度相似。如果需要声明函数引用类型的形参,需要显式写为void func( void (&f)(void) )的形式,和函数指针是完全不同的类型。


内容的提问来源于stack exchange,提问作者African_king

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 11:27:01