Если мы рассмотрим реализацию std::string, использующую подсчет ссылок, рассмотрим следующий сценарий:
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;
в неконстантных контекстах приведет к ненужным глубоким копиям. Я прав? Как реализации справляются с этой деталью?