Bereichsoperator ohne LVALUE



  • Hey ihr,

    Folgendes Beispiel:

    #include <iostream> 
    class X
    {
       friend class Y;
       friend void f(){}    
    };
    class Z
    {
       Y*ymem;
       void g()
       {
          return ::f();     
       }      
    };
    int main(void)
    {
       system("Pause");
    }
    

    In der Klasse Z wird "::f" zurückgegeben.
    Allerdings hat der Bereichsoperator hier keinen LVALUE.

    Man kann den Bereichsoperator sogar weglassen.
    In meinem Buch steht er aber da.

    Was hat das für eine Bewandnis?

    cya
    David



  • Der Bereichsoperator wird dann interessant, wenn Z eine eigene Methode f() hat:

    void f() { cout<<"globale Funktion"<<endl; }
    
    class Z
    {
    public:
      void f() { cout<<"Methode"<<endl; }
      void test()
      {
        f();
        ::f();
      }
    };
    

    (und der Bereichsoperator kann auch ohne einen linken Operanten verwendet werden (LVALUE ist was anderes ;))) - dann bezieht er sich auf den globalen Namensraum)



  • Ich dachte immer ein LVALUE wäre der linkte Operator.
    Und ein RVALUE der rechte Operatorwert.

    ::f()

    Globaler Namensbereich, mh?
    Ich dachte wenn man "::" weglässt würde automatisch der globale Namensbereich gewählt.

    cya
    David



  • Soweit ich weiß ist es so, dass nach und nach der Scope-Stack durchlaufen wird:

    Im aktuellen Scope nichts gefunden -> Suche in darüberliegendem Scope
    usw.



  • Aber so ist es doch auch, wenn ich :: weglasse.



  • 777 schrieb:

    Aber so ist es doch auch, wenn ich :: weglasse.

    So ist es nur, wenn Du :: weglässt. Mit :: wird keine Suche in anderen Namensbereichen als dem globalen durchgeführt.



  • 777 schrieb:

    Ich dachte immer ein LVALUE wäre der linkte Operator.
    Und ein RVALUE der rechte Operatorwert.

    Daher kommen die Bezeichnungen, aber inzwischen hat sich das etwas verschoben - LValue ist veränderbar (auf der linken Seite einer Zuweisung), RValue nicht (auf der rechten Seite der Zuweisung).

    Globaler Namensbereich, mh?
    Ich dachte wenn man "::" weglässt würde automatisch der globale Namensbereich gewählt.

    Nein, dann werden von der aktuellen Position aus alle umliegenden Scopes durchsucht, bis die Variable gefunden wurde (innere Blöcke, Funktion/Methode, Klasse, Namensräume) - nimm dir mal das Beispiel von mir und schau dir den Unterschied an.



  • Daher kommen die Bezeichnungen, aber inzwischen hat sich das etwas verschoben - LValue ist veränderbar (auf der linken Seite einer Zuweisung), RValue nicht (auf der rechten Seite der Zuweisung).

    Achso... bei Überladenen Operatoren 😉
    ThX- Verstanden.

    Das mit den Scopes hab ich auch verstanden. Bin echt superfroh, dass ihr mir so dabei helft den ganzen C++ Firlefanz zu verstehn. Ohne euch wäre ich vermutlich in meinem Buch spätestens bei S. 50 gescheitert - bin jetzt schon 10 Mal so weit!!!

    cya
    David


  • Mod

    Lvalue und Rvalus klassifizieren Ausdrücke nicht Operanden. Zudem leiten sich diese Bezeichnungen nur von typischen Fällen der Zuweisung ab - ob ein Ausdruck ein L- oder Rvalue ist, hängt nur vom Ausdruck selbst ab, nicht vom Operator, der ggf. darauf angewendet wird. Die meisten - aber nicht alle - Operanden sind selbst Ausdrücke, das hängt vom jeweiligen Operator ab.

    Die Operanden des Scope-Operators sind keine Ausdrücke sondern nur Namen. Ähnlich verhält es sich z.B. mit . und -> der rechte Operator ist hier eine Membername, kein Ausdruck (und für Zwecke der Überladung wird Letzterer als unärer Operator behandelt). Ein paar weitere Operatoren operieren ebenfalls nicht mit Ausdrücken: sizeof, typeid (wenn auf Typen angewandt), new


Anmelden zum Antworten