Jeśli weźmiemy pod uwagę realizację std :: string, który używa liczenia odniesienia, należy rozważyć następujący scenariusz:Iteratory i odniesienie liczone ciągi
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;
}
co dzieje się w L1 i L2? Czy liczenie odwołań jest zepsute i wykonywana jest głęboka kopia? Myślę, że tak, ale moje obawy mówi, że jeśli to nastąpi, wykonując proste:
cout << german[1] << endl;
lub prosty:
cout << *(german.begin()) << endl;
w kontekstach const będzie wykonywać niepotrzebnych głębokie kopie. Czy mam rację? W jaki sposób implementacje radzą sobie z tymi szczegółami?
To jeden z powodów, dlaczego odniesienia liczone 'std :: string's nie są tak popularne. To nie działa w ogóle tak dobrze, jak początkowo wyobrażałem. –