Если вы не определили класс Cref
, который решает эту проблему, тогда вы должны сделать то, что std::map
делает:
template class <K,V> class map{
V& operator[](K const & key);
}
Возвращает ссылку, которая должна быть подкреплена допустимой ячейкой памяти, и, следовательно,
std::map<string,string> m;
m["foo"];
assert(m.find("foo") != m.end());
Утверждение выполнится успешно (то есть "foo"
теперь является действительным ключом на карте), даже если вы никогда не назначали что-либо для m["foo"]
.
Это нелогичное поведение может быть исправлено классом Cref
в вашем примере - он может выполнять соответствующую логику для создания m["foo"]
только при назначении ссылки и гарантировать, что m.find("foo") == m.end()
, если вы этого не сделали выполнить какое-то задание, когда вы попытались прочитать несуществующий m["foo"]
.
Аналогично, в вашем классе String
(который является строкой с подсчетом ссылок - строки совместно используют свои строковые данные, и при изменении строки, данные которой совместно используются с другой строкой, создается новая копия), вы бы необходимо сделать копию при использовании operator[]
для чтения символов. Использование класса Cref
позволяет вам делать копии только при использовании operator[]
для записи.