@crarerw

Чем отличается ссылка на константу от обычной ссылки в аргументах перегруженного оператора в C++?

Есть код:
#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 у аргументов отключает цепное применение оператора? В чём вообще различие между ссылкой и ссылкой на константу в данном случае?
  • Вопрос задан
  • 230 просмотров
Пригласить эксперта
Ответы на вопрос 1
15432
@15432
Системный программист ^_^
Что-то вы странное с friend наворотили, я бы так сделал

class Z
{
  public:
    Z(){}
    Z(int i)	 { data = i;          }
    void print() { std::cout << data; }
    Z operator+ (Z& b);
  private:	
    int data;	
};

Z Z::operator + (Z& b)
{
  Z result;
  result.data = data + b.data;
  return result;
}

int main()
{
  Z a = 5;
  Z b = a + a + a;
  b.print();
}


Edit:
у меня оба варианта компилируются и работают
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы