stieß ich auf einem subtilen Fehler vor ein paar Tagen, wo der Code in etwa so aussah:Was nützt es heutzutage für "Enden"?
warostringstream ss;
int anInt(7);
ss << anInt << "HABITS";
ss << ends;
string theWholeLot = ss.str();
Das Problem, dass die ends
ein wie "7HABITS\0"
‚\ 0‘ in die ostringstream
so theWholeLot
sahen tatsächlich ragte (dh eine null am Ende)
Nun war dies nicht gezeigt, weil theWholeLot
dann benutzt wurde, um den const char *
Teil zu nehmen string::c_str()
verwenden, das bedeutete, dass die null maskiert war, da es nur ein Trennzeichen wurde. Wenn dies jedoch geändert wurde, um durchgehend Zeichenfolgen zu verwenden, bedeutete der Nullwert plötzlich etwas und Vergleiche wie zum Beispiel:
würde fehlschlagen. Das hat mich denken lassen: Vermutlich ist der Grund für ends
ein Rückfall zu den Tagen ostrstream
, wenn der Strom normalerweise nicht mit einer Null beendet wurde und so sein musste, dass str()
(die dann keine string
sondern eine char *
ausstrahlte) richtig funktionieren würde .
Aber jetzt, dass es nicht möglich ist, eine char *
von einem ostringstream
auszutreiben, ends
Verwendung ist nicht nur überflüssig, sondern potenziell gefährlich und ich überlege sie alle von meinen Kunden Code zu entfernen.
Kann jemand einen offensichtlichen Grund sehen, ends
in einer std::string
einzigen Umgebung zu benutzen?
Meine einzige Frage wäre, was ist eine std :: string nur Umgebung? Jedes nicht-triviale Programm wird char * Systemaufrufargumente, etc. sagen. That sagte, es gibt ein halbes Dutzend andere Weisen, damit umzugehen und Enden hat vernachlässigbare Nützlichkeit. – Duck
Hier ist eine Verwendung von 'std :: endet': http://stackoverflow.com/questions/624260/how-to-reuse-an-ostringstream/624291#624291 –
Es ist nicht nur für Strings. Es ist nützlich für allgemeine Streams. Einige Unix-Tools benötigen null Bytes als Abschlusszeichen. 'cout << endet;' wird ihnen zur Verfügung stellen. –