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
相关产品推荐
相关产品推荐

