Warum ist in der STL-String-Klasse kein überladener char * -Operator eingebaut? Gibt es einen bestimmten Grund, warum sie es vermeiden sollten?
Wenn es einen gab, würde die Verwendung der String-Klasse mit C-Funktionen viel bequemer werden.
Ich würde gerne Ihre Ansichten kennen.
Nachfolgend ist das Zitat aus dem Buch von Josuttis STL:
Es gibt jedoch keinen automatischen Typ Konvertierung von einem String-Objekt in eine C-Saite. Dies ist aus Sicherheitsgründen um unbeabsichtigte Typumwandlungen zu verhindern das Ergebnis seltsames Verhalten (Typ Char * hat oft seltsames Verhalten) und Mehrdeutigkeiten (zum Beispiel in einem Ausdruck, der eine Zeichenkette und eine C-Saite wäre möglich konvertiere String in char * und umgekehrt versa). Stattdessen gibt es mehrere Möglichkeiten zum Erstellen oder Schreiben / Kopieren in einem C-String, insbesondere c_str () ist bereitgestellt, um den Wert von a zu generieren String als C-String (als Zeichen Array, das '\ 0' als letztes hat Zeichen).
Sie sollten Cast-Operatoren immer vermeiden, da sie dazu neigen, Mehrdeutigkeiten in Ihren Code einzuführen, die nur durch die Verwendung weiterer Umwandlungen aufgelöst werden können, oder schlimmer noch kompilieren, aber nicht tun, was Sie erwarten. Ein char * () -Operator hätte viele Probleme. Zum Beispiel:
%Vor%würde ohne Warnung kompilieren, aber die Zeichenfolge überlisten.
Eine const-Version wäre möglich, aber da Strings (möglicherweise) kopiert werden müssen, um sie zu implementieren, hätte dies unerwünschte versteckte Kosten. Die explizite Funktion c_str () bedeutet, dass Sie immer angeben müssen, dass Sie wirklich ein const char * verwenden möchten.
Die String-Template-Spezifikation ermöglicht bewusst eine "getrennte" Darstellung von Strings, wobei der gesamte String-Inhalt aus mehreren Chunks besteht. Eine solche Darstellung erlaubt keine einfache Umwandlung in char *.
Die Zeichenfolgenvorlage stellt jedoch auch die Methode c_str für genau den gewünschten Zweck bereit: Was ist falsch an der Verwendung dieser Methode?
Wenn Sie Interoperabilität mit C-Style-Funktionen benötigen, ist die Verwendung von std::vector<char>
/ <wchar_t>
oft einfacher.
Es ist nicht so praktisch, und leider können Sie nicht O (1) -wap es mit einem std::string
(jetzt das wäre eine nette Sache).
In dieser Hinsicht bevorzuge ich die Schnittstelle von MFC / ATL CString
, die strengere Leistungsgarantien hat, Interop bereitstellt und breite Zeichen- / Unicode-Zeichenfolgen nicht als völlig fremd behandelt (aber ok, letzteres ist etwas Plattform) Spezifisch).