Если мы рассмотрим реализацию станд :: строка, которая использует подсчет ссылок, рассмотрим следующий сценарий:итераторы и ссылки подсчитывали строки
int main()
{
string english = "Hello";
string german = english; //refcnt = 2
string german2 = german;
/* L1 */ german[1] = 'a';
/* L2 */ *(german2.begin() + 1) = 'A';
cout << english << endl << german << endl << german2 << endl;
return 0;
}
Что происходит в L1 и L2? Выполняется ли подсчет ссылок и выполняется глубокая копия? Я думаю, что это так, но мое беспокойство говорит, что если это произойдет, делая простой:
cout << german[1] << endl;
или просто:
cout << *(german.begin()) << endl;
в неконстантных контекстах будет выполнять ненужные глубокие копии. Я прав? Каким образом реализации имеют дело с этой деталью?
Это одна из причин, почему подсчет ссылок 'STD :: string's не так популярны. Это не работает вообще, как первоначально предполагалось. –