C++中函数指针两种调用写法(*b)()和b()的区别是什么
问题相关代码
#include <bits/stdc++.h> using namespace std; void test(){ int a = 100; cout << a << endl; } int main() { void(*b)() = test; (*b)(); //表达式一 b(); //表达式二 return 0; }
两种写法的区别
- 实际上在C++标准规则下,
(*b)()和b()没有任何运行层面的差异,生成的可执行代码完全一致,仅存在写法风格的区别:(*b)()是更早期的C语言遗留写法,显式表达了「对函数指针解引用得到函数后再调用」的逻辑,可读性更强,适合刚接触函数指针的开发者理解逻辑。b()是C、C++标准都支持的简化写法,语法上更简洁,是现在主流的使用风格。
为什么
b()可以正常运行 这是C++标准明确规定的语法规则,核心是两类语法设计的支撑:
- 函数类型的左值(比如直接使用函数名
test)在需要函数指针的场景下,会自动触发函数到指针的隐式转换,直接得到指向该函数的指针,不需要手动取地址。 - 函数调用运算符
()的操作数本身就支持两种合法类型:- 函数类型的左值
- 指向函数的指针
也就是说你不管是传解引用后的函数左值,还是直接传函数指针,都符合调用运算符的语法要求。甚至你可以写任意层数的解引用,比如(**b)()、(***b)(),都能正常运行,因为每次对函数指针解引用得到函数左值后,只要后续需要指针就会自动转换回来,多层解引用也完全符合规则。
内容的提问来源于stack exchange,提问作者init
相关产品推荐
相关产品推荐

