Betrachten Sie den folgenden Code, basierend auf this answer:Temporär in einem Funktionsaufruf: UB?
#include <iostream>
#include <sstream>
class StringBuilder {
public:
template <typename T> inline StringBuilder &operator<<(T const &t) {
ss << t;
return *this;
}
inline char const * c_str() {
return ss.str().c_str();
}
private:
std::stringstream ss;
};
void foo(const char *x) {
std::cout << x << std::endl;
}
int main() {
foo((StringBuilder() << "testing " << 12 << 3 << 4).c_str());
return 0;
}
Hat foo()
mit der temporären StringBuilder
‚s Rückgabewert Ursache UB in irgendeiner Weise nennen?
Der Grund, warum ich frage ist, dass das obige Beispiel funktioniert, aber im wirklichen Leben benutze ich eine Bibliothek, die unter anderem Protokollierungsmöglichkeiten enthält, und mit dieser Bibliothek bekomme ich falsche Ausgabe (die Logging-Funktion nimmt meine char*
richtig, aber überschreibt es intern, was mich dazu gebracht hat zu glauben, dass der Speicher nicht mehr gültig ist).
Sie haben UB in 'return ss.str(). C_str();' Siehe: http://stackoverflow.com/questions/21034834/is-there-issue-will-stringstream-str-c-str – Hayt