Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, c-smile, Вы писали:
CS>>Я ж про это и говорю.
CS>>CS>>const char[] - immutable.
CS>> char[] - mutable.
CS>>
VD>immutable — это характиристика типа. const же всего лишь предохраняет от модификации переменной.
C точки зрения формальной логики
class A{...};
const A a;
const A есть образование нового типа A' у которого отсутвуют (или закрыты) все мутирующие методы.
immutability может быть "ручной" и "автоматической" — в С# доступна только "ручная". В C++ и первая и вторая.
CS>>В C# и Java проблема (проблема ли?) — нет понятия deep immutable:
CS>>CS>>int foo(in MyClass cls)
CS>>
CS>>in защищает от изменения переменную cls в вызывающей процедуре
CS>>но сам объект передаваемый — конем гуляй по нему.
VD>Объект или передается по значению и тогда хоть обмодифицируйся. Или по ссылке. При этом возмжность модификации объекта зависит от того ползволяет ли он себя модифицировать.
VD>Например, попроубуй изменить в C# строку или значение типа DateTimr.
Я ж и говорю — зависит от ручной импелементации. В Java например String immutable а DateTime — нет.
Автоматической — нет.
CS>>const MyClass& cls в C++ означает что для cls объекта в классе
CS>>MyClass подавлены все изменяющие методы.
VD>Нет. cls означет, что ссылка недопускает модфикации объекта. В то же время всегда можно создать новую ссылку или указатель и модифицировать через него тот же объект. Модифицировать же immutable-объект невозможно.
Мы говорим не про mutability enforcment, а про нормальное использование.
Из-за того что в C++ используется deep immutability который(ая) есть вещь суровая, то для практических целей оставлен
const_cast<> — явное снятие immutability.
Полный режим readonly возможен только на хардверном уровне.