为什么此代码不会产生模糊的呼叫错误

Why this code does not generate an ambigous call error?

本文关键字:模糊 呼叫 错误 代码 为什么      更新时间:2023-10-16

我已经写了 mycomplex class> class and the plus( )运算符AS:

class MyComplex
{
public:
        operator int() { return realPart; }
        MyComplex(int r, int i=0)
        {
                realPart = r;
                imaginaryPart = i;
        }
    int operator +(int i) { return imaginaryPart+i; }
private:
        int realPart, imaginaryPart;
};
int main()
{
        MyComplex c(5, 4);
        cout << c+10 << "n"; // Why is this not ambiguous?
}

我认为可以将表达式 C 10 解释为尝试添加两个整数( c in c 10 将是使用转换运算符运算符int())将其降级到整数,或通过Overload Operator函数 int Operator (int I)作为Overload Operator呼叫。但是该程序没有任何错误编译,并产生了输出为14。如何?

当我们弄清楚 c+10的含义时,我们进行了一个称为"超载分辨率"的过程,该过程首先通过名称查找找到所有可行的候选人。

在这种情况下,可行的候选人是:

MyComplex::operator+(MyComplex&, int); // via c.operator+(10)
::operator+(int, int);                 // via c.operator int() + 10

然后,我们查看哪个转换序列更好。对于第一个过载,无需转换-cMyComplex的确切匹配,10int的确切匹配。对于第二个过载,第二个参数是确切的匹配,但是第一个参数必须通过MyComplex::operator int()进行用户定义的转换。

精确匹配的等级高于转换,因此首选第一个过载。


请注意,如果您的MyComplex::operator+()取得了long(例如),则呼叫将模棱两可。每个过载的转化序列都会更好。