Есть код:
#include <iostream>
class Z
{
public:
Z(){}
Z(int i) { data = i; }
void print() { std::cout << data; }
friend Z operator+ (Z& a, Z& b);
private:
int data;
};
Z operator + (Z& a, Z& b)
{
Z result;
result.data = a.data + b.data;
return result;
}
int main()
{
Z a = 5;
Z b = a + a + a;
b.print();
}
Он не работает. Компилятор ругается:
[Error] no match for 'operator+' (operand types are 'Z' and 'Z')
Z b = a + a + a;
^
[Note] candidate is:
[Note] Z operator+(Z&, Z&)
[Note] no known conversion for argument 1 from 'Z' to 'Z&'
Если убрать одно слагаемое, код скомпилируется.
Если к аргументам оператора приписать модификатор const, всё также заработает.
Почему отсутствие модификатора const у аргументов отключает цепное применение оператора? В чём вообще различие между ссылкой и ссылкой на константу в данном случае?