Wenn wir eine std :: string Implementierung berücksichtigen, die Referenzzählung verwendet, betrachten Sie dieses Szenario:Iteratoren und Referenz gezählt Strings
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;
}
Was in L1 und L2 geschieht? Ist die Referenzzählung unterbrochen und wird eine Tiefenkopie durchgeführt? Ich denke schon, aber meine Sorge sagt, dass, wenn dies geschieht, ein einfaches tun:
cout << german[1] << endl;
oder einfach: durchführen würde unnötig tiefe Kopien
cout << *(german.begin()) << endl;
in nicht konstanten Kontexten. Habe ich recht? Wie gehen die Implementierungen mit diesem Detail um?
Dies ist ein Grund, warum Referenz gezählt 'std :: string's sind nicht so beliebt. Es funktioniert überhaupt nicht so gut wie ursprünglich gedacht. –