Проблема в том, что вы принимаете объект по неконстантной ссылке, а не по const
ссылке.
Объект Test
, возвращаемый operator+()
, является временным. Неконстантная ссылка не может привязываться к временному .
Причина, по которой это, вероятно, работало раньше, заключается в том, что operator+
выполнялся слева направо - что бы выглядело примерно так:
object + object + object
temporary + object
Временная функция по-прежнему имеет функцию operator+()
, поэтому ее можно вызывать.
С другой стороны, когда вы используете скобки, она выполняется следующим образом:
object + object + object
object + temporary
Это означает, что временное значение заканчивается на a
, что, опять же, не может произойти по причинам, указанным выше.
Чтобы исправить, либо а) превратить его в const
ссылка, или b) передача по значению (не рекомендуется, поскольку это создает дополнительные копии в памяти, которая вам не нужна):
// a
Test operator +(const Test &a)
// b
Test operator +(Test a)
Я также настоятельно рекомендую сделать эту функцию также const
:
// a
Test operator +(const Test &a) const
// b
Test operator +(Test a) const
Теперь вы можете добавлять const
объекты, даже если они также находятся справа.