为什么表达式a()和(****& a)()调用相同的函数?

时间:2013-05-18 15:41:21

标签: c++

有这段代码:

void a() { }

int main(){
   a();
   (****&a)();
   return 0;
}

声明(****&a)();a();具有相同效果的情况如何?

1 个答案:

答案 0 :(得分:7)

这完全是因为函数到指针的转换(§4.3):

  

函数类型T的左值可以转换为类型为“T指针”的prvalue。结果是指向函数的指针。

&a首先为您提供指向a的指针。然后用*取消引用它,为你提供函数本身。然后,您尝试取消引用该函数,但由于您不能,它会进行函数到指针转换以再次获取指针。您可以使用*取消引用该指针,依此类推。

最后(****&a)表示函数a并且您调用它,因为您可以将()应用于函数而不进行函数到指针转换。