c++ 多参数函数重载的优先级混淆[重复]

bxjv4tth  于 12个月前  发布在  其他
关注(0)|答案(2)|浏览(94)

此问题在此处已有答案

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

为什么?为什么?

g2ieeal7

g2ieeal71#

首先,请注意,有两件事会影响重载解决方案:

fct(f, 1)

  • f是一个float,所以没有候选者是不合格的。引用绑定或隐式转换使调用成为可能。候选者3.和4.比1.和2.好。
  • 1int类型的右值,const int&可以绑定到它,但int&不能。引用绑定比转换到floatdouble更好。

因此,4号是最佳人选。

fct(f, i)

  • 对于f,请参见上面的说明。
  • iint类型的左值,将int&绑定到它比绑定const int&更好,因为添加const是额外的限定转换。此外,引用绑定比将int转换为floatdouble更好。

因此,3号是最佳人选。

y0u0uwnf

y0u0uwnf2#

或调用B,我们期望有歧义,但它不是3
不,第四个void fct (const float&, const int&)需要对两个参数进行转换为const,而第三个void fct ( float&, int&)不需要。因此,对于调用f(f, i),第三个void fct ( float&, int&)比第四个f(f, i)更好。

相关问题