我正在为即将到来的一次考试练习,我在一次练习中发现了一段奇怪的代码。对于背景来说,这是一个练习,你必须判断代码是否能运行,有什么问题等等。我觉得奇怪的代码是下面这段。
class A {
int x;
public:
A(int i = 0) { x = i;}
A operator+(const A& a) { return a.x + x;}
...\\ rest of the code is not relevant
};
很自然地,我认为操作符会产生一个错误,因为它返回的是一个int值,而它的返回类型被定义为A类。 然而,在我的IDE中插入整个例子后,为了检查我是否正确,不仅在函数声明时没有抛出错误,而且代码中后来的一个加法操作实际上 "工作 "了(我用引号是因为它返回的值是垃圾,但它也没有抛出任何错误)。
为什么这个没有抛出任何错误?
int
是隐式转换为 A
,通过 A(int)
构造函数。你的 operator+
实际上 return A{a.x + x};
这并不是重载操作符所特有的--每当提供一种类型的表达式,而期望的是另一种类型时,编译器就会寻找方法隐式地将前者转换为后者。