Нет веских причин для возврата объекта const.Однако есть много веских причин для возврата указателей или ссылок на const-объекты.
В программе может быть объект, который очень дорого копировать, поэтому он возвращает ссылку.Тем не менее, объект не должен быть изменен через эту ссылку.Например, он может быть частью отсортированной структуры данных, и если его значения были изменены, он больше не будет сортироваться правильно.Таким образом, const предотвращает его случайное изменение.
Арифметические операторные функции не должны возвращать константные объекты, в точности из-за проблем в вашем вопросе.
Разыменование итератора должно возвращать ссылку на констант.Это если он работает с коллекцией const-объектов или, возможно, с коллекцией const.Вот почему функции класса иногда имеют две копии функции со второй копией, использующей const для самой функции, например:
T& operator[](size_t index);
const T& operator[](size_t index) const;
Первая функция будет использоваться для неконстантных объектов, а втораяфункция будет использоваться для константных объектов.