我在学校学习 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;
有两个函数调用给我带来了问题。
fct(f, 1);
对于呼叫 A,我们的逻辑是:
由于函数 4 对于两个参数都是可调用的,所以我们的结论是函数 4 被调用,结果就是这样。耶!
fct(f, i);
对于呼叫 B,我们的逻辑是:
由于两个函数都是可调用的并且两个参数共享相同的优先级,因此我们得出结论该调用是不明确的。但是,事实证明它不是,并且调用了函数 3。而这一点,我们不明白。
然后我们假设对于参数 (f),float& 比 const float& 具有最高优先级,但是调用 A 应该是不明确的(事实并非如此)。
no4
,它是 no4
,no3
。为什么?
首先,请注意有两件事可以对重载决策产生影响:
fct(f, 1)
f
是
float
,所以没有一个候选人被取消资格。引用绑定或隐式转换使调用成为可能。 候选人 3. 和 4. 比候选人 1. 和 2. 好
1
是
int
和
const int&
类型的右值,但
int&
不能绑定到它。与转换为
float
或
double
相比,引用绑定可以提供更好的转换顺序。
fct(f, i)
f
,请参阅上面的解释。
i
是一个
int
,将
int&
绑定到它比绑定
const int&
更好,因为添加
const
是额外的限定转换。 此外,引用绑定比将
int
转换为
float
或
double
更好。
或者打电话给B,我们期望有歧义,但事实并非如此不,第四个
void fct (const float&, const int&)
需要对两个参数进行所谓的转换为const,而第三个
void fct ( float&, int&)
则不需要。因此,第三个比第四个好。来电
f(f, i)
。