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

时间:2016-04-02 02:57:21

标签: c++ function syntax parentheses function-call

我最近遇到的代码如下:

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

int main(){
  //...
  (function)(1,2,3);
  //...
}

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

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

2 个答案:

答案 0 :(得分:5)

我能想到的唯一情况是将function定义为宏。

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

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

答案 1 :(得分:3)

除了抑制类似函数的宏扩展外,还在括号suppresses argument-dependent lookup中包装一个非限定函数名。例如:

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
}