Итераторы и строки с подсчетом ссылок

Если мы рассмотрим реализацию 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;

в неконстантных контекстах приведет к ненужным глубоким копиям. Я прав? Как реализации справляются с этой деталью?

7
задан ebasconp 21 June 2012 в 23:52
поделиться