此问题在此处已有答案:
Overloading reference vs const reference(2个答案)
C++ function overloading resolution involving pass-by-value, reference and constant reference(3个答案)
overloading a function which differs from the original only by "const" in parameter list [duplicate](2个答案)
3天前关闭。
我在学校学习C++。我们目前正在讨论重载函数的主题。我们得到了一个带有初始代码块的练习。然后,我们显示了一个函数调用,我们必须确定选择了哪个函数,或者调用是否有二义性(如果是)。我们使用C++20。
这是代码块,
void fct ( int, float) {cout << "Function no 1" << endl;}
void fct ( int, double) {cout << "Function no 2" << endl;}
void fct ( float&, int&) {cout << "Function no 3" << endl;}
void fct (const float&, const int&) {cout << "Function no 4" << endl;}
int i = 1;
int& ri = i;
char c = 'A';
float f = 2.f;
double d = 3.0;
const double& rdC = d;
字符串
有两个函数调用给我带来了给予问题。
调用A:fct(f, 1);
对于调用A,我们的逻辑是:
- 对于第一个参数(f),函数3和4都是可调用的,并且共享相同的优先级(这是完美的类型对应)。
- 对于第二个参数(1),函数1,2,4是可调用的,但是函数4具有最高的优先级(这是完美的类型对应)。
由于函数4可以被两个参数调用,我们的结论是函数4被调用了,结果是这样的。
调用B:fct(f, i);
对于call B,我们的逻辑是:
- 对于第一个参数(f),函数3和4都是可调用的,并且共享相同的优先级(这是完美的类型对应)。
- 对于第二个参数(i),函数3和4都是可调用的,并且共享相同的优先级(这是完美的类型对应)。
由于两个函数都是可调用的,并且两个参数的优先级相同,因此我们得出结论,该调用是二义性的。但是,事实证明并非如此,并且函数3被调用。对此,我们不理解。
然后我们假设对于参数(f),float&具有比const float&更高的优先级,但是调用A应该是二义性的(实际上不是)。
tl; dr
- 对于调用A,我们期望
no4
,它是no4
, - 对于调用B,我们期望是不明确的,但它是
no3
。
为什么?为什么?
2条答案
按热度按时间g2ieeal71#
首先,请注意,有两件事会影响重载解决方案:
fct(f, 1)
f
是一个float
,所以没有候选者是不合格的。引用绑定或隐式转换使调用成为可能。候选者3.和4.比1.和2.好。1
是int
类型的右值,const int&
可以绑定到它,但int&
不能。引用绑定比转换到float
或double
更好。因此,4号是最佳人选。
fct(f, i)
f
,请参见上面的说明。i
是int
类型的左值,将int&
绑定到它比绑定const int&
更好,因为添加const
是额外的限定转换。此外,引用绑定比将int
转换为float
或double
更好。因此,3号是最佳人选。
y0u0uwnf2#
或调用B,我们期望有歧义,但它不是3
不,第四个
void fct (const float&, const int&)
需要对两个参数进行转换为const,而第三个void fct ( float&, int&)
不需要。因此,对于调用f(f, i)
,第三个void fct ( float&, int&)
比第四个f(f, i)
更好。