Я вычеркну это из оператора присваивания.
i3 = i1 + i2;
Первое, что произойдет, будет вычисление выражения сложения.Вот этот фрагмент кода:
i1 + i2
Вы разработали перегрузку вашего оператора для обработки этого выражения.Ваша пользовательская перегрузка оператора сложения возвращает новый экземпляр Integer
.Но проблема возникает, когда вы пытаетесь назначить этот новый экземпляр параметру в вашей перегрузке назначения.Вот фрагмент этого кода.
Integer& Integer::operator=(Integer& rhs);
Когда вы используете ссылочный параметр в объявлении функции, компилятор проверяет, чтобы убедиться, что это значение не является временным значением, чтобы оно существовало после функцииназывается.Компилятор определил (правильно), что аргумент, переданный этому оператору присваивания, является временным значением.Вот почему он выдает ошибку, когда вы пытаетесь сделать это.
Самая логичная причина, по которой я вижу смысл в вашем коде , имеет смысл - это реализовать следующее:
Integer& Integer::operator=(const Integer& rhs) {
this->i = rhs.i;
return *this;
}
Добавляя const-спецификатор, вы сообщаете компилятору, что вы не полагаетесь на rhs
для сохранения существования после вызова функции.В этом случае значение, передаваемое параметру, может быть временным значением.