Die "Geschichte" war, dass vor langer Zeit, als alle in einzelnen Threads arbeiteten oder zumindest die Threads Arbeiter mit ihren eigenen Daten waren, sie eine String-Klasse für C ++ entwarfen, die die Handhabung von Strings einfacher machte als zuvor, und sie überlasteten Operator + zum Verketten von Zeichenfolgen.
Das Problem war, dass Benutzer so etwas tun würden:
s = s1 + s2 + s3 + s4;
und jede Verkettung würde eine temporäre erzeugen, die eine Zeichenfolge implementieren musste.
Daher hatte jemand die Gehirnwelle der "faulen Auswertung", so dass Sie intern eine Art "Seil" mit allen Zeichenfolgen speichern konnten, bis jemand es als C-Zeichenfolge lesen wollte. An diesem Punkt würden Sie die interne Darstellung in einen zusammenhängenden Puffer ändern .
Dies löste das obige Problem, verursachte jedoch eine Menge anderer Kopfschmerzen, insbesondere in der Multithread-Welt, in der erwartet wurde, dass eine .c_str () -Operation schreibgeschützt ist / nichts ändert und daher nichts gesperrt werden muss. Vorzeitiges internes Sperren in der Klassenimplementierung für den Fall, dass jemand Multithreading durchführte (wenn es nicht einmal einen Threading-Standard gab), war ebenfalls keine gute Idee. Tatsächlich war es teurer, dies zu tun, als jedes Mal einfach den Puffer zu kopieren. Der gleiche Grund, warum die Implementierung "Beim Schreiben kopieren" für Zeichenfolgenimplementierungen abgebrochen wurde.
Daher .c_str()stellte sich heraus, dass es am sinnvollsten ist , eine wirklich unveränderliche Operation durchzuführen. Könnte man sich jedoch in einem Standard, der jetzt Thread-fähig ist, darauf "verlassen"? Aus diesem Grund hat der neue Standard entschieden, dass dies eindeutig möglich ist, und daher muss die interne Darstellung den Nullterminator enthalten.