И по смыслу неконстантность здесь не лепится, напр
C++ (Qt)
void AnotherClass::DoSomething( MyClass & data )
{
...
data.UpdateFiles();
int count = data.GetNumFiles();
..
}
Выглядит как DoSomething предназначен чтобы сделать что-то с экземпляром MyClass - но в действительности он им просто пользуется
напротив. выглядит так, словно DoSomething хочет изменить состояние data
и по факту именно это и происходит.
есть логическое разделение: "только для чтения", и "для изменения".
ну так вот, и внешний дизайн DoSomething,
и её реализация указывают,
что она будет изменять объект.
логическое "только для чтения" - например, мы лочим мутекс, что бы прочитать данные.
для этого приходится делать мутекс mutable,
потому что он свое состояние меняет,
несмотря на то, что все что нам нужно - просто прочитать состояние агрегата.
однако после окончания операции чтения, мы мутекс разлочиваем, и он тоже принимает первоначальное состояние.
таким образом, логическое состояние не изменялось.
а бинарное состояние "до" и "после" осталось прежнем.
но в вашей ситуации - не просто чтение. вы реально обновляете компонент.
он у вас не только бинарно, но и логически тоже изменяется.
меняет состояние со "старого" на "обновленное".
пользуясь функцией DoSomething, я знаю, что после её запуска,
моя data может быть принципиально в другом состоянии, отличном от изначального.
а вот если бы она выглядела так, словно только для чтения,
а сама по факту меняла бы данные,
то это был бы сюрприз для стороннего программиста.
Придется наверное смириться с const_cast внутрях
ага. потом программер будет чесать репу:
почему так? объект не должен был измениться,
но мало того, что изменился, так ещё и покрашел весь процесс.
он же не знает, что прототип врет,
и туда нельзя было сувать объекты, состояние которых не должно меняться.
он же не знает, что там под капотом конст_каст снимает константность,
и затем состояние объекта изменяется.
он думает: ну раз функция якобы только для чтения,
и раз она принимает объект по константной ссылке, то значит не будет его изменять.
он очень удивится, и далеко не сразу поймет причину ошибки,
когда попытается вызвать такую функцию, скормив ей константный объект.
модификация объекта, рожденного константой - UB.
оптимизирующий компилятор запросто может поместить такой объект в область памяти только для чтения.
const_cast + modification = upppssss ...
-----------------------------------------------------
вы боретесь с последствиями ущербного дизайна.
и в попытке заставить его через палку работать,
готовы наставить таких костылей,
которые могут привести к трагичным последствиям.