为什么我会调用函数名称包含在parens中的函数?

Tre*_*key 3 c++ syntax function parentheses function-call

我最近遇到的代码看起来像这样:

void function(int a, int b, int c){
  //...
}

int main(){
  //...
  (function)(1,2,3);
  //...
}
Run Code Online (Sandbox Code Playgroud)

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

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

Kei*_*son 5

我能想到的唯一function一个问题就是将其定义为宏.

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

至于语言允许语法的原因,函数调用包含指向函数类型的表达式,后跟括号中的参数.在大多数情况下,前缀是一个函数名(它被隐式转换为指向函数的指针),但它可以是一个任意表达式.任何表达式都可以括在括号中,通常不会改变其含义(除了影响优先级).(但请参阅Jonathan Leffler对一些反例的评论.)

  • 本书继续给出两个例子:`decltype(auto)f1(){int x = 0; ...返回x; // decltype(x)是int,所以f1返回int}`和`decltype(auto)f2(){int x = 0; ... return(x); // decltype((x))是int&,所以f2返回int&}`这主要只是一个FYI - 但我发现它非常有趣,而且意外.它会在某些不寻常的情况下略微修改你所说的内容. (4认同)
  • 在"有效的现代C++"中,Scott Meyers说:_"在`int x = 0;````是一个变量的名称,所以`decltype(x)`是`int`.但是在括号中包含名称`x`-"`(x)`" - 表达比名称更复杂的表达式.作为一个名称,`x`是一个左值,C++也将表达式`(x)`定义为左值.`decltype((x))`因此是`int&`.在名称周围加上括号可以改变decltype为其报告的类型!... C++ 14对decltype(auto)[...]的支持意味着你编写return语句的方式看似微不足道的改变会影响函数的推导类型"_ (3认同)