为什么我要调用一个函数名用括号括起来的函数

why would I call a function with the function name wrapped in parens?

本文关键字:函数 起来 一个 调用 我要 为什么      更新时间:2023-10-16

我最近遇到了这样的代码:

void function(int a, int b, int c){
  //...
}
int main(){
  //...
  (function)(1,2,3);
  //...
}

将函数名单独包装在parens中有什么意义
它是否具有与function(1,2,3);不同的影响?

为什么语言允许这样的语法?

我能想到的唯一重要的情况是当function被定义为宏时。

在C中,标准库函数也可以实现为类似函数的宏(为了提高效率)。将函数名称括在括号中会调用实际函数(因为函数名称后面没有()。

至于为什么语言允许语法,函数调用由指向函数类型的指针表达式和括号中的参数组成。在大多数情况下,前缀是函数名(隐式转换为指向函数的指针),但它可以是任意表达式任何表达式都可以用括号括起来,通常而不改变其含义(影响优先级除外)。(但请参阅Jonathan Leffler的评论以了解一些反例。)

除了抑制类似函数的宏展开外,将不合格的函数名括在括号中还可以抑制与参数相关的查找。例如:

namespace meow {
    struct kitty {};
    void purr(kitty) {}
}
int main() {
    meow::kitty stl;
    purr(stl); // OK, ADL finds meow::purr
    (purr)(stl); // error; no ADL is performed
}