具有多个参数的函数重载的优先级混乱[重复]

问题描述 投票:0回答:2

我在学校学习 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);

对于呼叫 B,我们的逻辑是:

  • 对于第一个参数(f),函数3和4都是可调用的,并且具有相同的优先级(这是完美的类型对应)。
  • 对于第二个参数(i),函数3和4都是可调用的,并且具有相同的优先级(这是完美的类型对应)。两个参数都是一样的。

由于两个函数都是可调用的并且两个参数共享相同的优先级,因此我们得出结论该调用是不明确的。但是,事实证明它不是,并且调用了函数 3。而这一点,我们不明白。

然后我们假设对于参数 (f),float& 比 const float& 具有最高优先级,但是调用 A 应该是不明确的(事实并非如此)。

tl;博士

  • 对于呼叫 A,我们期望
    no4
    ,它是
    no4
  • 对于呼叫 B,我们预计会有歧义,但它是
    no3

为什么?

c++ overload-resolution
2个回答
1
投票

首先,请注意有两件事可以对重载决策产生影响:

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 是最佳候选者。


0
投票
或者打电话给B,我们期望有歧义,但事实并非如此

不,第四个

void fct (const float&, const int&)

需要对两个参数进行所谓的
转换为const,而第三个void fct ( float&, int&)
则不需要。因此,第三个比第四个好。来电
f(f, i)

© www.soinside.com 2019 - 2024. All rights reserved.