operator << vs. operator= links -> rechts oder rechst -> links?



  • Hi,

    Diese Frage bezieht sich auf die links- und rechts-haendigen Argumente der operator<< und operator== (assigment) in den folgenden Zeilen:

    Zeile 1: myclass1 = myclass2 = myclass3; // Class type MyClass
    Zeile 2: cout << myclass1 << myclass2 << myclass3 << endl;

    Obenstehendes funktioniert hervorragend wenn operator<< und operator= (assigment) ueberladen sind fuer MyClass:

    MyClass & MyClass::operator=(MyClass & rhs);
    ostream & operator<<(ostream & os, MyClass & myclass);

    QUESTION:
    ------------------
    Zeile1 wird von rechts nach links verarbeitet, wobei myclass 3 das "rhs" Argument vom meist rechten operator= ist. Das Resultat wird dann das "rhs" vom naechten, meist linken, operator=.

    So far, so good.

    Aber dann Zeile2: Ausgefuehrt von rechts nach links? Wenn ja, das meist rechte operator= nimmt dann eine MyClass& als l-value und einen Strom als r-value. Und so einen operator gibt's nicht (nicht von mir auf jeden Fall in diesem Code!).

    Also, wie funktioniert das denn hier??

    SUGGESTION: Is the line 2 executed from left to right in stead? In that
    case I could understand the operator logic at least ... but then: what with
    the reversed order???

    M.fr.Gr.,

    Ytsen.



  • Zeile 2 könnte man auch so schreiben

    endl(operator<<(operator<<(operator<<(cout, myclass1), myclass2), myclass3))
    

    Ich denke dann wird es klarer.



  • Nur die einstelligen sowie die Zuweisungsoperatoren sind rechtsbindend, alle anderen Operatoren sind linksbindend (wie man es von den mathematischen Operatoren auch gewohnt ist).
    Obwohl der << Operator hier als Streaming-Operator benutzt wird (anstatt als Linksschieben), so bleibt dessen Priorität und Bindung erhalten.



  • Braunstein schrieb:

    Zeile 2 könnte man auch so schreiben

    endl(operator<<(operator<<(operator<<(cout, myclass1), myclass2), myclass3))
    

    Ich denke dann wird es klarer.

    Danke fuer den Hinweis!!, ich glaube ich muss mal ein wenig diese Stroeme studieren 🙂

    Cheers,

    Ytsen.


Log in to reply