#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
是常量,不能通过(非常量)引用传递。所以重载集中只有一个函数,也就是被调用的函数。
对于somefunc(b)
,两个函数都可以被调用。所以重载集有两个函数,somefunc(int)
和somefunc(int&)
。现在编译器必须确定哪个函数是参数 10
的“最佳匹配”。规则是 int
和 int&
都提供“精确匹配”,因此规则不会优先于另一个,并且调用不明确。
如果函数的第二个版本是 somefunc(const int&)
而不是 somefunc(int&)
调用 somefunc(10)
也会有歧义。
关于c++ - 函数重载 - 传递常量与传递变量 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41250025/