指向函数的指针的重载解析

Overload resolution for pointer to 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]:

Overload resolution selects the function to call in seven distinct contexts within the language:

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

A use of an overloaded function name without arguments is resolved in certain contexts to a function, a pointer to function or a pointer to member function for a specific function from the overload set. ... The function selected is the one whose type is identical to the function type of the target type required in the context. -- ISO/IEC 14882:2011(E) §13.4 [over.over] (emphasis mine)

此处未使用标准重载解析规则,因为您要分配给函数指针类型,因此编译器将简单地 select 与函数指针类型完全匹配的函数重载。