我编写了一个 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
然后我们看看哪个转换顺序更好。对于第一个重载,不需要转换 - c
是 MyComplex
的精确匹配,10
是 int< 的精确匹配
。对于第二个重载,第二个参数完全匹配,但第一个参数必须通过 MyComplex::operator int()
进行用户定义的转换。
Exact Match 的排名高于 Conversion,因此首选第一个重载。
请注意,如果您的 MyComplex::operator+()
使用了一个 long
(例如),那么调用将不明确。每个重载都会有一个更好和一个更差的转换序列。
关于c++ - 为什么此代码不会生成不明确的调用错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41156200/