功能传递常数与传递变量C


#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的"最佳匹配"。规则是intint&都提供了一个"精确匹配",因此规则不喜欢另一个规则,呼叫模棱两可。

如果该函数的第二版为somefunc(const int&)而不是somefunc(int&) CAND somefunc(10)也将是模棱两可的。

最新更新