#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&)
,则调用somefunc(10)
也将是模棱两可的。