Я пытаюсь понять, какова реальная проблема с возвратом ссылки, изучая перегрузку операторов. Я создаю эту очень простую проблему:
#include <iostream>
using namespace std;
class mydoub {
public:
double pub;
mydoub(double i = 0) : pub(i) {}
};
mydoub &operator += (mydoub &a, double b) {
a.pub = a.pub+b;
return a;
}
int main() {
mydoub a(5), b(6);
cout << "1: " << a.pub << " " << b.pub << endl; // expected output 1: 5 6
b = a+= 7;
cout << "2: " << a.pub << " " << b.pub << endl; // expected output 2: 12 12
b.pub = 8;
cout << "3: " << a.pub << " " << b.pub << endl; // unexpected output: 3: 12 8
}
Вывод:
1: 5 6
2: 12 12
3: 12 8
, что для меня совершенно неожиданно. Фактически, b
была присвоена ссылка на a
, сразу после того, как последняя была изменена, поэтому я ожидаю, что b.pub=8
будет действовать и на a
, в результате передачи ссылки через оператор +=
. Почему это не так? Какая тогда разница с нереферентной перегрузкой, скажем mydoub operator += ( ..
?