Oltre ai motivi pubblicati qui c'è anche un altro - compabilità binaria . I writer delle biblioteche non hanno alcun controllo su quale implementazione di std::string stai usando e se abbia lo stesso layout di memoria del loro.
std::string è un modello, quindi la sua implementazione è presa dalle intestazioni STL locali. Ora immagina di utilizzare localmente una versione STL ottimizzata per le prestazioni, pienamente compatibile con lo standard. Ad esempio, potresti aver scelto di intromettersi il buffer statico in ogni std::string per ridurre il numero di allocazioni dinamiche e di mancate cache. Di conseguenza, il layout della memoria e / o la dimensione dell'implementazione sono diversi da quelli della libreria.
Se solo il layout è diverso, alcune funzioni membro std::string chiamano su istanze passate dalla libreria al client o viceversa potrebbero non riuscire, a seconda di quali membri sono stati spostati.
Se anche la dimensione è diversa, tutti i tipi di libreria con std::string membro avranno dimensioni diverse di quando sono registrati nella libreria e nel codice client. I membri di dati che seguono il membro std::string avranno offset anche spostati, e qualsiasi accesso diretto / accessore in linea chiamato dal client restituirà spazzatura, nonostante "cerchi OK" durante il debug della libreria stessa.
Bottomline - se la libreria e il codice cliente sono compilati di nuovo con diverse std::string versioni, si collegheranno bene, ma potrebbero risultare in alcuni bug sgradevoli e difficili da capire. Se si modifica l'implementazione di std::string , tutte le librerie che espongono i membri da STL devono essere ricompilate in modo che corrispondano al layout std::string del client. E poiché i programmatori vogliono che le loro librerie siano robuste raramente vedrai std::string esposte ovunque.
Per essere onesti, questo vale per tutti i tipi di STL. IIRC non hanno un layout di memoria standarizzato.