c++ - 为什么此代码不会生成不明确的调用错误?

标签 c++ operator-overloading

我编写了一个 MyComplex 类并重载了加号 (+) 运算符:

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+10 中的 c 将是使用转换运算符 operator int()) 降级为整数,或通过重载运算符函数 int operator +(int i) 调用重载运算符。但是程序编译没有任何错误并产生了 14 的输出。如何?

最佳答案

当我们弄清楚 c+10 的含义时,我们会执行一个称为重载决策的过程,该过程首先通过名称查找找到所有可行的候选者。

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

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

然后我们看看哪个转换顺序更好。对于第一个重载,不需要转换 - cMyComplex 的精确匹配,10int< 的精确匹配。对于第二个重载,第二个参数完全匹配,但第一个参数必须通过 MyComplex::operator int() 进行用户定义的转换。

Exact Match 的排名高于 Conversion,因此首选第一个重载。


请注意,如果您的 MyComplex::operator+() 使用了一个 long(例如),那么调用不明确。每个重载都会有一个更好和一个更差的转换序列。

关于c++ - 为什么此代码不会生成不明确的调用错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41156200/

相关文章:

c++ - 覆盖在祖 parent 的构造函数中调用的祖 parent 的虚拟方法

c++ - 使用 OpenGL 4.5 更改所选顶点的颜色

c++ - 第三方库导致 'undefined reference'编译错误?

c++ - 如何检查 const 数组成员在编译时是否单调增长

c++ - 重载 ostream 运算符以从文件打印矩阵

generics - 如何在特征边界中指定 `std::ops::Mul` 的预期结果?

java - Java 中是否存在运算符重载?

c# - 是否可以将对象类型转换为 bool 以根据状态返回某些内容?

c++ - 运算符重载和指向对象的指针,c++

c++ - 运算符重载非成员函数?