C++ 旧结构运算符重载语法更改了吗?

C++ old struct operator overloading syntax changed?

我正在构建 20 多年前的旧 CPP 代码,但是 g++ 给出了构建错误。有人可以向我解释发生了什么变化吗?谢谢。 (在 turbo C 中很好)

错误:

t_overload.cpp:8:40: error: no matching constructor for initialization of 'Point'
    Point operator+(Point& v) { return Point(x+v.x, y+v.y); }
                                       ^~~~~~~~~~~~~~~~~~~

cpp 文件:

#include <stdio.h>

struct Point {
    int x, y;
//    Point(Point& v) {set(v.x, v.y);}     // build okay without this line; error if uncomment
    Point(int a, int b) {set(a,b);}
    void set(int a, int b) {x=a, y=b;}
    Point operator+(Point& v) { return Point(x+v.x, y+v.y); }
};

int main() {
    Point a(1,2);
    Point b(a);

    Point c = a + b;
    printf("%d %d\n", c.x, c.y);
}
Point(Point& v)

复制构造函数应该采用 constant 参数,这应该是:

Point(const Point& v)

但是鉴于复制构造函数的作用,它是完全没有必要的。你可以完全摆脱它。

Point operator+(Point& v) 

同样,重载的参数应该是常量:

Point operator+(const Point& v) 

"What are the basic rules and idioms for operator overloading?"

这两个问题,以及相当微妙和微妙的重载规则以及临时对象如何绑定到函数参数,导致了您的编译错误。