Перегрузка префиксных и постфиксных инкрементов/декрементов в контексте присвоения объектов друг другу

Есть задача - написать класс некоего ящика с длиной, шириной, высоток. также нужно для него выполнить перегрузку операций =, ++ и -- в префиксных и постфиксных формах.

В разных источниках описаны способы перегрузки инкрементов и декрементов как операторных функций-членов примерно так:

// Перегрузка постфиксной операции "++"
Box operator++(int i){
    Box temp =*this;
    ++*this;
return temp;
}
// Перегрузка постфиксной операции "--"
Box operator--(int i){
    Box temp =*this;
    --*this;
return temp;
}

// Перегрузка префиксной операции "++"
Box &operator++(){
    length++;
    width++;
    height++;
return *this;
}

// Перегрузка префиксной операции "--"
Box &operator--(){
    length--;
    width--;
    height--;
return *this;
}

Эти операции действительно работают в форматах отдельных инструкций:

Box b(3,4,5);

b++; ++b; b--; --b;
Box c;
c = b;

Но две формы инкрменетов/декрементов заведены ради их различий, проявляемых при присвоениях вида:

с = b++;
c = --b;

Здесь возникает проблема:

с = ++b; //работает
с = b++; //не компилируется

и выдает ошибку:

task3.cpp:106:7: error: cannot bind non-const lvalue reference of type ‘Box&’ to an rvalue of type ‘Box’
  106 |  с = b++;
      |      ~^~

Подскажите, пожалуйста, как быть?


Ответы (1 шт):

Автор решения: Harry

Так, как вы делаете — все верно и компилируется: https://ideone.com/k1IwLt

Поэтому приходится сделать вывод, что у вас, скорее всего, написан оператор присваивания, и написан не совсем корректно. Если судить по сообщению об ошибке, вы передаете ему просто ссылку, не константную... Добавьте квалификатор const в аргументе оператора присваивания.

→ Ссылка