Es ist möglich (und bekommen) einen Zeiger auf ein temporäres Objekt zu erstellen, vorausgesetzt, dass Sie wissen, was Sie tun. Es sollte jedoch anders gemacht werden.
Eine Funktion mit Rückgabewert eines Nicht-Referenztyps gibt rvalue zurück. In C++ ist das Anwenden des eingebauten unären Operators &
auf einen R-Wert verboten. Es erfordert einen Lvalue.
Das heißt, wenn Sie einen Zeiger auf Ihr temporäres Objekt erhalten möchten, müssen Sie es auf andere Weise tun. Zum Beispiel, als eine zweizeilige Sequenz
const string &r = f1(str);
f2(&r);
die auch
f2(&(const string &) f1(str));
In beiden Fällen über der f2
Funktion durch Verwendung einer Guss in eine einzige Linie gefaltet werden können, sollte einen const string *
Parameter akzeptieren. Nur ein string *
wie in Ihrem Fall wird nicht funktionieren, es sei denn, Sie wegwerfen Konstanz aus dem Argument (was, BTW, wird das Ganze noch hässlicher machen als es bereits ist). Obwohl, wenn der Speicher mir dient, gibt es in beiden Fällen keine Garantie, dass die Referenz an das ursprüngliche temporäre und nicht an eine Kopie angehängt wird.
Denken Sie daran, obwohl das Erstellen von Zeigern auf temporäre Objekte eine eher zweifelhafte Praxis ist, wenn die offensichtliche Lebensdauer Probleme. Normalerweise sollten Sie die Notwendigkeit vermeiden, dies zu tun.
Aber ich kann f1() so verwenden: f1 (str) = "glücklich"; Hier verwende ich temporär als l-Wert. –
Happy Mittal, das Wort lvalue mag ein wenig verwirrend sein - es bedeutet nicht mehr "ein Wert, der auf der linken Seite einer Aufgabe stehen kann". Wenn Sie den Operator '=' verwenden, rufen Sie tatsächlich eine Elementfunktion des Zeichenfolgenobjekts auf. Sie dürfen Mitglieder von rvalues verwenden. – avakar
Was würde also passieren, wenn String einen expliziten Operator & {return this;} hätte? – user168715