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
-
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