C++ 为什么重载运算符可以返回其返回类型以外的内容?

C++ 为什么重载运算符可以返回其返回类型以外的内容?,c++,oop,operator-overloading,C++,Oop,Operator Overloading,我正在为即将到来的一次考试进行练习,在一次练习中我发现了一段奇怪的代码。在上下文中,这是一个必须确定代码是否会运行、有什么问题等的练习。我觉得奇怪的代码如下: 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 }; 当然,我假设操作符会生成一个错误

我正在为即将到来的一次考试进行练习,在一次练习中我发现了一段奇怪的代码。在上下文中,这是一个必须确定代码是否会运行、有什么问题等的练习。我觉得奇怪的代码如下:

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值,而它的返回类型被定义为class A。然而,在我的IDE中插入整个示例之后,为了检查我是否正确,不仅在函数声明中没有抛出错误,但代码中后来的一个加法操作实际上“起作用”(我使用引号,因为它返回的值是垃圾,但也没有抛出任何错误)


为什么这不会引发任何错误?

int
通过
A(int)
构造函数隐式转换为
A
。您的
操作符+
实际上执行
返回一个{A.x+x}


这并不是重载运算符特有的—每当提供一种类型的表达式而预期使用另一种类型时,编译器都在寻找将前者隐式转换为后者的方法。

“其余代码不相关”:是否确定?然后删除该代码并运行程序。你仍然得到垃圾输出吗?标记
A(int)
constructor
explicit
并观察发生了什么。我不再得到垃圾输出了;是的,似乎在其他地方有问题。正如前面提到的,这是一个隐式转换。有关控制隐式转换的规则,请参见。本例中的具体示例是该链接列表中的第三个示例