Здравствуйте, vdimas, Вы писали:
[сcode]
template<typename T>
class ImmutableValue {
const T value_;
public:
ImmutableValue(T && value) : value_(value) {}
[/cсode]
Хм. А там точно будет
ссылка на оригинал, а не дубликат? Похоже, вы свой код не проверяли.
А если "исправить" ваш код так:
template<typename T>
class ImmutableValue {
const T& value_;
то мы легко убедимся, что чудес не бывает.
Покажите мне пример кода, в котором вы изготавливаете из мутабельного объекта иммутабельный, и продемонстрируйте, что вы после этого не можете этот иммутабельный изменить.
V>Далее в своём коде используешь шаблонный ImmutableMap.
Вот прямо так сразу использовать шаблонный ImmutableMap не получится. Вы, как водится, привели тот самый фрагмент кода, который был очевиден и без обсуждения.
Как вы реализуете метод add(const TKey & key, const TValue & value)?
Внезапно окажется, что нельзя просто взять произвольный mutable тип, завернуть его в ImmutableValue и наслаждацца. Даже если вы сможете реализовать своё обещание с "zero-overhead" конструктором перемещения (в чём я почему-то сомневаюсь), реализация изменяющих методов "в лоб" потребует от вас реализовать copy-on-write, что убъёт производительность.
Чтобы ваш "мутабельно-иммутабельный" словарь можно было применять в реальной жизни, придётся особенным образом проектировать его мутабельную версию. Посмотрите для примера в код классов ImmutableXXX.Builder всё в том же неймспейсе.
V>В С++ ключевое слово const применимо так же к полям структур/классов.
V>Такие поля могут быть инициализированы только в конструкторе.
V>Это аналог readonly в C#.
Это всё понятно. Да, слово const есть, можно применять его к мемберам. Счастье-то в чём?
V>Это не столько про саму иммутабельность, сколько про специальные алгоритмы на иммутабельных графах и списках.
Чегось? Какие ещё алгоритмы? Какие графы? Там ровно то, что написано в названии неймспейса — реализация иммутабельного списка, словаря, множества, массива, стека, очереди, и ещё пары классов.
V>Соответственно, ценностью этого раздела библиотеки является уже готовая функциональность, а не какие-то там гарантии.
V>(никаких гарантий та система типов не даёт)
Конечно даёт.
Вот мой метод:
public void RegisterState(ImmutableDictionary<string, int> state)
{
_visited[state] = true;
}
Попробуйте "сломать" его, передав в него мутабельный state.