die folgende Funktion vor:temporäre string Drehen() in einzelne Anweisung c_str
void f(const char* str);
Angenommen, ich möchte eine Zeichenfolge generieren string verwenden und es an diese Funktion übergeben. Wenn ich es in einer Erklärung tun will, könnte ich versuchen:
f((std::ostringstream() << "Value: " << 5).str().c_str()); // error
Dies gibt eine Fehlermeldung: ‚str()‘ ist kein Mitglied von ‚basic_ostream‘ ist. OK, also Operator < < gibt ostream statt ostringstream zurück - wie wäre es, es in einen ostringstream zurückzuwerfen?
1) Ist das sicher?
f(static_cast<std::ostringstream&>(std::ostringstream() << "Value: " << 5).str().c_str()); // incorrect output
Jetzt mit diesem, stellt sich heraus, für den Bediener < < ("Wert:") nennen, ist es tatsächlich Ostream Bedienungs < < (void *) und Drucken eines Hex-Adresse ruft. Das ist falsch, ich will den Text.
2) Warum ruft der Operator < < auf dem temporären std :: ostringstream() den Ostream-Operator auf? Sicherlich hat das Temporäre eine Art "ostringstream" nicht "ostream"?
Ich kann die temporäre zu erzwingen, um den richtigen Operator Anruf auch zu erzwingen!
f(static_cast<std::ostringstream&>(static_cast<std::ostringstream&>(std::ostringstream()) << "Value: " << 5).str().c_str());
Dies scheint zu arbeiten und übergibt "Wert: 5" bis f().
3) Verlasse ich mich jetzt auf undefiniertes Verhalten? Die Modelle sehen ungewöhnlich aus.
Ich bin mir bewusst, die beste Alternative so etwas wie diese:
std::ostringstream ss;
ss << "Value: " << 5;
f(ss.str().c_str());
... aber ich bin daran interessiert, das Verhalten in einer Linie zu tun. Angenommen, jemand wollte ein (zweifelhaftes) Makro erstellen:
Würde dies wie erwartet funktionieren?
Mögliche Duplikat [string, string und char \ * Umwandlung Verwirrung] (http://stackoverflow.com/questions/1374468/stringstream-string-and-char-conversion-confusion). – jww