以下列方式调用函数有什么区别?

bqu*_*i56 17 c c++

foo();

(*foo)();

(&foo)();
Run Code Online (Sandbox Code Playgroud)

这些函数调用之间究竟有什么区别(假设foo()在某处定义)?是否有任何一种情况可能会被用于另一种情况?

另外,为什么不&foo()*foo()工作?

Wug*_*Wug 25

实际调用之间没有区别(相反,根据foo()声明的方式,它们都会做同样的事情)

C和C++中的所有函数调用都是通过在函数调用括号之前出现的函数指针表达式进行的.必要时会发生非指针类型的隐式地址.

这是一个演示C++行为的想法.

原因&foo()*foo()不起作用的是函数调用运算符()优先于*&.所以他们可能会工作,这取决于你对返回值做了什么. &foo()将获取返回值的地址,并*foo()取消引用它.在某些情况下,这些操作中的任何一个或两者都可能是合法的.考虑一个返回引用指针类型的函数.

部分答案取自R ..的评论.

  • 我只想弄清楚谁投票,以及为什么.没有解释而投票的人是愚蠢的.也许他们只是错过了upvote按钮.; d (5认同)

Mik*_*our 10

你没有确切地说是什么foo,但我认为这是一个功能.

这些函数调用之间究竟有什么区别?

显然,第一个使用通常的语法调用函数.

第三个获取函数的地址并尝试调用它; 该语言允许调用函数指针,就好像它们是它们指向的函数一样,所以这相当于foo().

第二个尝试取消引用该功能.解除引用需要一个指针,并且该语言允许从函数到指向该函数的指针的隐式转换,因此这相当于(*(&foo))(),而这相当于foo().

总结一下:这三个人做同样的事情.

是否有任何一种情况可能会被用于另一种情况?

除非你喜欢用不必要的heiroglyphics来装饰你的代码,否则没有理由使用除第一种形式之外的任何函数或函数指针.

另外,为什么不&foo()*foo()工作?

优先规则意味着它们等同于&(foo())*(foo()); 即他们调用函数并尝试取结果的地址和取消引用.如果函数具有返回类型,则第一个表单将"起作用"; 第二个将"工作",如果它返回一个指针或(在C++中)带有重载的一元的东西operator*().