#include <iostream>
using namespace std;
void somefunc(int a)
{
cout<<"somefunc1";
}
void somefunc(int &b)
{
cout<<"somefunc2";
}
int main()
{
// case 1
somefunc(10); // works fine and prints somefunc1
//case2
int b=10;
somefunc(b); // generates compiler error that overloading is ambiguous
return 0;
}
在main()
中,如果我通过常数(例如10
)程序编译并运行和打印"somefunc1"
,但是当我通过变量(在这种情况下为b
)时,编译器会生成一个错误,以使超载含糊不清。
我不明白它在内部工作。请帮忙!!
超载分辨率的规则有些复杂。这是一个简化的,适用于此特定示例。
编译器经历的第一步是找到"过载集",即可以在参数中调用的函数集。对于somefunc(10)
,只能调用somefunc(int)
;somefunc(int&)
无法称呼,因为10
是常数,无法通过(非const)引用传递。因此,过载集中只有一个函数,这就是被调用的功能。
对于somefunc(b)
,可以调用两个功能。因此,过载集具有两个功能somefunc(int)
和somefunc(int&)
。现在,编译器必须确定哪个函数是参数10
的"最佳匹配"。规则是int
和int&
都提供了一个"精确匹配",因此规则不喜欢另一个规则,呼叫模棱两可。
如果该函数的第二版为somefunc(const int&)
而不是somefunc(int&)
CAND somefunc(10)
也将是模棱两可的。