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

10-08 16:03