指向函数的指针的重载分辨率

时间:2015-01-18 07:37:25

标签: c++ function

当调用该函数时,它清楚如何执行名称查找和重载解析。但是当没有调用函数时会发生什么?例如。

#include <iostream>

using std::cout;
using std::endl;

void foo(int){ cout << "foo(int)" << endl; }
void foo(int, int){ cout << "foo(int, int)" << endl; }

void (*baz)(int, int);


int main()
{ 
    baz = foo; //1
    baz(1, 1); 
}

DEMO

在这种情况下,我们有两个名为foo的函数,正式地,非限定名称查找它们。标准第13条并未涵盖该案例,因为它仅涉及函数调用上下文N3797:13.3/2 [over.match]

  

重载分辨率选择七个不同的调用函数   语言中的上下文:

1 个答案:

答案 0 :(得分:2)

在这种情况下的行为受C ++ 11标准中的这种措辞的支配(N3797中有类似的部分):

  

使用不带参数的重载函数名称会在某些上下文中解析为函数,指向函数的指针或指向过载集中特定函数的成员函数的指针。 ... 选择的功能   是一个类型与上下文中所需的目标类型的函数类型相同的那个。 - ISO / IEC 14882:2011(E)§13.4[over.over](强调我的)

这里没有使用标准的重载决策规则,因为你要分配一个函数指针类型,所以编译器只需选择与函数指针类型完全匹配的函数重载。