Se consideriamo un'implementazione std :: string che utilizza il conteggio di riferimento, si consideri questo scenario:Iteratori e di riferimento contato stringhe
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;
}
Cosa succede in L1 e L2? Il conteggio dei riferimenti è rotto e viene eseguita una copia profonda? Credo di sì, ma la mia preoccupazione dice che se ciò si verifica, facendo un semplice:
cout << german[1] << endl;
o un semplice:
cout << *(german.begin()) << endl;
in contesti non-const sarebbe eseguire copie profonde inutili. Ho ragione? In che modo le implementazioni trattano questo dettaglio?
Questo è uno dei motivi per cui riferimento contato 'std :: string's non sono così popolari Non funziona affatto come inizialmente immaginato. –