Оператор C ++ перегружен с использованием функции друга.Попытка добавить несколько объектов не удалась - PullRequest
0 голосов
/ 19 ноября 2018

Почему компилятор показывает 'error' во 2-м случае?(Я дал ссылку на полную программу) Почему я должен использовать ключевое слово const?

1-й случай:

friend Complex operator + (const Complex &,const Complex &);

Complex c5 = c1+c2+c3+c4; 

2-й случай:

friend Complex operator + ( Complex &, Complex &); 

Complex c5 = c1+c2+c3+c4; 

1-й случай Полная программа - Я получаю правильный вывод

2-й случай Полная программа - ошибка: нет совпадения для 'operator +'

Ответы [ 3 ]

0 голосов
/ 19 ноября 2018

Временные ссылки не привязываются к неконстантным ссылкам.Когда вы пишете это

auto c3 = c2 + c1 + c0; 

, сначала вычисляется c1+c0, а результат передается в c2.operator+().Когда оператор объявляет, что он принимает Complex&, вы не можете передать временное сообщение, а когда требуется const Complex&, вы можете это сделать.Передача временного значения, когда ожидается неконстантная ссылка, является логической ошибкой в ​​90% случаев, поэтому она запрещена.

0 голосов
/ 19 ноября 2018

Complex& не будет привязан к временному, Complex const& будет.

Каждый + возвращает временный.

Как правило, вы хотите:

friend Complex operator + (Complex,const Complex &);

но здесь два const& подойдут.

0 голосов
/ 19 ноября 2018

Выражение c1+c2+c3+c4 анализируется и оценивается, как если бы

Complex c5 = operator+(c1, operator+(c2, operator+(c3, c4)));

operator+(c3, c4) создает и возвращает временный Complex объект: значение.

C ++ запрещает привязывать rvalue к неконстантной lvalue-ссылке .

Но operator+(Complex&, Complex&) принимает неконстантную lvalue-ссылку. Отсюда и сообщение об ошибке.

С другой стороны, operator+(Complex const&, Complex const&) принимает ссылки на постоянные значения.

...