Comments 6
Примение Immutable, говорит что объект не должен меняться.
применение const говорит, что объект не должен меняться
Дополнительный уровень защиты
…
Оверхед
У вас два пункта противоречат друг другу. Либо для передачи immutable по const& будет происходить копия, либо допустим точно такой же хак с const_cast'ом для изменения внутреннего объекта.
Это вопрос вопрос вкуса, но представляется, что выражение вида
Immutable<Type **> p(...);
выглядит понятнее чем
const Type *const *const p = …;
Не выглядит. Рядовой c++ программист прекрасно знает что такое const, а шаблон Immutable ему придется изучить. А потом еще часами чесать репу чтобы понять, зачем вообще этот шаблон нужен и используется, кроме как по прихоти автора.
Const примененный непосредственно к обьекту (а не ссылке на обьект) отлично все говорит о его иммутабельности. Существование не -const ссылок — о mutaбельности со стороны кода который ими владеет. И если создавать иммутабельный обьект копированием то достаточно собственно просто создать const-обьект копированием. Причем это можно сделать прямо в аргументах функции, просто из традиционной конструкции const X& амперсанд убираете и все.
Вы опять упустили главное, а именно принципиальное отличие const
от immutable
.
Указание const
в аргументах функции означает, что функция не может изменить значение передаваемой по ссылке переменной. При этом функцию мало волнует внешний код.
А передача immutable
означает, что ни функция, ни внешний код не могут изменить значение переменной в процессе выполнения функции. Здесь immutable
является контрактом.
Всё остальное (приведение типов, хитрое представление в памяти) — ерунда. Забудьте про const_cast
— это тоже злобный хак, которого стоит избегать. Единственное его предназначение — создание костыля для работы с какой-нибудь старой библиотекой. В хорошем коде const_cast
должен отсутствовать.
Иммутабельные данные в С++. Часть 2