Когда вы пишете:
auto blah = map[key];
оператор [] вызывается с key
, и она возвращает значение.
Когда вы пишете:
map[key] = blah;
то оператор [ключ] вызывается с key
, и она возвращает значение, а затем оператор = называется по значению с blah
аргументом.
Это означает, что может быть трудно обнаружить, где бы вы на самом деле не читали или не писали карту.
Однако, как правило, в том случае, READ, случай может упасть обратно в value const& operator[] const
называется, в то время как во время записи, было бы value& operator[]
без константных маркеров. Таким образом, вы можете может попытаться перегрузить оператор по спецификатору const: предоставить 2 оператора [] s, один const, один неконстантный и увеличить размер только в последнем.
Этих простой простой, но не всегда будет работать должным образом, как вы могли бы произойти в какое-то время accidentially призывают «оператора [] для чтения», но без ограничения константного определяемого в этой точке с помощью компилятора. Я не могу сейчас точно сказать, когда и как, и если это вообще возможно, но я предполагаю, что вы можете легко ударить, если вы не очень осторожны с константой.
Если вы попали, что, то единственный вариант известный мне бы предоставить оболочку для возвращаемого значения в режиме неконстантного и оставить нормально сопзИте режим:
myMap::valueType const & operator[](key...) const
mymap::wrapper<myMap::valueType>& operator[](key...)
Вашей обертка будет помнить реф & на вашу карту и woudl запомните KEY, и эта оболочка предоставит неявное преобразование-TO-valueType, и оно предоставит оператор присваивания FROM-valueType-TO-wrappertype. Неявное преобразование-to-valuetype woudl выполняет команду read-from-map from from-given-key и не увеличивает счетчик te, а оператор = (from-valuetype, to-wrappertype) выполняет запись на карту.
Это наверняка работает, но такой подход может быть устаревшим. Я не владеет с изменениями от c'11, так что, возможно, некоторые лучше опция доступна сейчас - например, движение &&
семантика может изменить что-то здесь, то есть может быть перегрузка
valueType&& operator[](key)
также возможно --- - но Я понятия не имею. Я знаю только подход return-a-transparent-wrapper.
EDIT: вот хороший (кажется, полный) Пример правильного оператора [] перегрузок, которые поддерживают чтение и запись, и что различает эти два:
stack: How to do some stuff with values assigned in subscript operator?
Если имеется в виду ваш класс будет K-> V отображение, то оператор [] должен быть определен как 'ValueType & оператора [] (keyType key) ', потому что, когда вы пишете' map [key] ', вы обычно хотите читать/записывать значение, хранящееся под этим заданным ключом. – quetzalcoatl
Правильно! Но два типа были String, поэтому я не видел эту ошибку. Любые идеи для моей проблемы? – Apaachee