Funktionsaufrufe als l-Value ... (Häh ???)



  • Hallo,

    ich arbeite mich gerade durch das Buch "Thinking in C++" und treffe dort in Kapitel Acht über Konstanten auf folgenden Beispielcode

    class X 
    {
    	int i;
    	public:
    	X(int ii = 0);
    };
    
    X::X(int ii) { i = ii; }
    
    X f5() 
    {
    	return X();
    }
    
    int main() 
    {
    	f5() = X(1); //was soll der Blödsinn ?
    }
    

    Diese Zeilen werden einem wie selbstverständlich entgegengeworfen, und mir stellen sich folgende Fragen:

    - Wieso wird denn einer Funktion ein Wert zugewiesen, was ändert das konkret fuer diese Funktion ?
    - Was könnte eine sinnvolle Verwendung fuer soetwas sein ?
    - Hat danach die Funktion irgendeinen Wert (zb. 1) ?

    Ich verstehe, dass in f5 eine Klasse X mit Standardkonstructor erzeugt und zurückgegeben wird - oder beinflusst die Zuweisung die Zeile return X();
    Das lässt sich leider schlecht durch Debuggen herausfinden, da das alles ja innerhalb einer Zeile passiert.

    thx,
    Sepp



  • SeppSchrot schrieb:

    //was soll der Blödsinn ?
    

    genau das denken sich viele leute und machen deshalb ihre funktionen in der art

    const X f5() {/*...*/}
    

    um sowas wie f5() = X(1) zu verbieten.

    da geht das dann nicht mehr. sollte wahrscheinlich genau darauf hinausgehen.
    mit builtin geht es zum beispiel so, wie mit const X. also als richtlinie quasi "do as the ints do" - obwohl ich hier auch schon gegenmeinungen gehört hab. einfach mal die suchfunktion verwenden.



  • Ja, du hast Recht, es sollte wirklich demonstriert werden, wie man das mit const verhindern kann.

    Also hat es keinerlei Bedeutung, einer Funktion einen Wert zuzuweisen ?
    Ich dachte es wäre vielleicht ein kaum bekanntes Feature von C++ 😉

    Zum Beispiel, dass man eine Funktion definiert und dem Compiler dann sagt:
    Arbeite die Funktion durch, und zwar SO, dass alle darin enthaltenen Befehle SO abgearbeitet werden, dass die Rückgabe der Funktion meinem gewünschten Wert entsprechen.Das wär doch mal was... 🤡



  • SeppSchrot schrieb:

    - Wieso wird denn einer Funktion ein Wert zugewiesen, was ändert das konkret fuer diese Funktion ?

    Auch wenn es so aussieht weist du nicht der Funktion einen Wert zu, sondern deren Rückgabe. Und das das funktionert ist absolut logisch, auch wenn mir kein sinnvoller Einsatz einfällt. Die Funktion gibt eine Variable zurück, die genauso als l als auch als r-Value genutzt werden kann.

    Gruß
    Entyl Sa



  • Nunja sinnvoller Einsatz...

    Was glaubt ihr wie es funktioniert, dass ihr bei einem std::vector mit dem operator[] ein Vektorelement nicht nur abfragen, sondern auch verändern könnt?



  • Flashbang schrieb:

    Was glaubt ihr wie es funktioniert, dass ihr bei einem std::vector mit dem operator[] ein Vektorelement nicht nur abfragen, sondern auch verändern könnt?

    An der Rückgabe einer Referenz?
    Hier geht es aber um die Rückgabe by Value.


Anmelden zum Antworten