Исходя из фона С#, я привык к практике создания структур неизменяемых.
Поэтому, когда я начал программировать на С++, я попытался сделать то же самое с типами, которые я обычно передавал по значению.
У меня была простая структура, которая представляет собой настраиваемый индекс и просто обертывает целое число. Поскольку в С++ ключевое слово const
несколько похоже на readonly
в С#, представляется разумным реализовать мою структуру следующим образом:
struct MyIndex
{
MyIndex(int value) :
Value(value)
{
}
const int Value;
};
Проблема с этим подходом заключается в том, что эта структура ведет себя совершенно иначе, чем неизменяемая структура в С#. Не только то, что поле Value переменной MyIndex
не может быть изменено, но и любая существующая переменная MyIndex
(локальная переменная или переменная поля) не может быть заменена другим MyIndex
-instance.
Итак, следующие примеры кода не компилируются:
a) Использование индекса в качестве переменной цикла.
MyIndex index(0);
while(someCondition)
{
DoWork();
index = MyIndex(index.Value + 1); // This does not compile!
}
b) Изменение поля элемента типа MyIndex
class MyClass
{
MyIndex Index;
void SetMyIndex(MyIndex index)
{
Index = index; // This does not compile!
}
};
Эти два примера не компилируются, ошибка сборки одинакова:
ошибка C2582: функция 'operator =' недоступна в 'MyIndex'
В чем причина этого? Почему переменные не могут быть заменены другим экземпляром, несмотря на то, что они не являются const
? И что означает ошибка сборки? Что это за функция operator =
?