bfDeveloper
@bfDeveloper

Mutable или T* const?

Вопрос чисто идеологический или даже риторический.

Необходимо изменять поле класса в константном методе. Допустим константность нам досталось по иерархии наследования, а какое-то своё поле менять хочется.

Первый выход — mutable. Всё работает, но некоторые говорят, что mutable это плохо и вообще костыль.

Второй выход — объявить наше поле указателем на нужные данные. Так как константность будет относится к указателю, до данные можно спокойно менять.

Понятно, что сама ситуация скользкая, но довольно частая. Я считаю, что mutable честнее, ведь это явное указание, что мы собираемся нарушать правила. А указатель это маскировка того же самого. Но есть и абсолютно обратное мнение.

А как думаете вы?
  • Вопрос задан
  • 2953 просмотра
Пригласить эксперта
Ответы на вопрос 4
seagull
@seagull
mutable показывает что с нашей точки зрения атрибут не сильно важен и не влияет на константность класа. Тоесть например, если мы передаем класс аргументом в функцию, например, то ничего страшного не произойдет, если атрибуты mutable будуть изменены. Тоесть при использовании mutable нужно ответить на вопрос: Содержит ли атрибут очень важную информацию или нет.

А что касается с T* const то в данной ситуации это и есть костыль. Используя mutable мы декларируем, что собираемся изменять атрибут, а вот T* const этого как раз не говорят. А потом будет тяжело разобраться кто есть кто.
Ответ написан
Комментировать
@rtorsten
Есть еще вариант — const_cast.
Ответ написан
ixSci
@ixSci
Если константность Вам досталась по наследству и Вы не можете этого изменить, то выбирайте любой вариант и не надо слушать всяких снобов о «некрасивости, неэтичности» и прочем. Все эти «неэтичные» средства в языке, как раз и созданы для того, чтобы обрабатывать нестандартные ситуации.
Если по теме, то я бы выбрал mutable.
К примеру, для того, чтобы сделать getItem для потоко-безопасного, разделяемого контейнера может потребоваться использование mutex.lock(). При этом, getItem семантически является константным, и должен быть объявлен как getItem const; но чтобы лочить mutex в этом методе, необходимо его изменение. Где бы Вы не встретили решение подобной проблемы, бьюсь об заклад, что mutex будет объявлен как mutable поле класса.
Ответ написан
Комментировать
DenKon
@DenKon
Если речь идет о каком-то конкретном методе, я бы использовал const_cast. Он легко ищется в коде и показывает на явный костыль.
Если их много — тогда mutable.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы