指向函数的指针的重载解析
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);
}
在这种情况下,我们有两个名称为 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 与函数指针类型完全匹配的函数重载。
当函数被调用时,很清楚名称查找和重载解析是如何执行的。但是当函数没有被调用时会发生什么?例如。
#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);
}
在这种情况下,我们有两个名称为 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 与函数指针类型完全匹配的函数重载。