Oltre ai motivi pubblicati qui, ce n'è anche un altro: la compatibilità binaria . Gli autori delle librerie non hanno alcun controllo su quale std::stringimplementazione si sta utilizzando e se ha lo stesso layout di memoria della 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, è possibile che si sia scelto di inserire un buffer statico in ciascuno std::stringdi essi per ridurre il numero di allocazioni dinamiche e errori nella cache. Di conseguenza, il layout e / o la dimensione della memoria dell'implementazione sono diversi da quelli della libreria.
Se solo il layout è diverso, alcune std::stringfunzioni dei membri richiamano 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 che hanno std::stringmembri appariranno di dimensioni diverse quando vengono controllati nella libreria e nel codice client. Anche i membri di dati che seguono il std::stringmembro avranno gli offset spostati, e qualsiasi accesso diretto / accessorio in linea chiamato dal client restituirà spazzatura, nonostante "sembri OK" durante il debug della libreria stessa.
In conclusione: se la libreria e il codice client vengono compilati di nuovo in std::stringversioni diverse , si collegheranno perfettamente, ma potrebbe risultare in alcuni bug cattivi e difficili da capire. Se si modifica l' std::stringimplementazione, è necessario ricompilare tutte le librerie che espongono i membri da STL in modo che corrispondano al std::stringlayout del client . E poiché i programmatori vogliono che le loro librerie siano robuste, raramente le vedrai std::stringesposte ovunque.
Ad essere onesti, questo vale per tutti i tipi di STL. IIRC non hanno layout di memoria standardizzati.