C++ 函数指针的重载解析

C++ 函数指针的重载解析,c++,function,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, in

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

#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); 
}
#包括
使用std::cout;
使用std::endl;

void foo(int){cout本例中的行为受C++11标准中的这一措辞管辖(N3797中有类似的部分):

在某些上下文中,不带参数的重载函数名的使用会解析为重载集中特定函数的函数、函数指针或成员函数指针。…所选函数 其类型与上下文中要求的目标类型的功能类型相同。--ISO/IEC 14882:2011(E)§13.4[结束](重点)


这里不使用标准重载解析规则,因为您正在为函数指针类型赋值,因此编译器只需选择与函数指针类型完全匹配的函数重载。

foo
隐式转换为
void(*)(int,int)
因此这里没有重载解析——当您分配给特定类型的函数指针时,您是在隐式选择特定重载。@cdhowie不太清楚。名称查找会同时查找两个函数,然后尝试将每个函数隐式转换为
void(*)(int,int)
,对吗?一个变量不能有两个值-因此编译器选择具有相同类型的值。在本例中,它是运行演示时给定的
foo(int,int)