Geht das mit jedem Std.-konformen Compiler?
-
Situation:
struct a { void foo() { } a *operator->() { return this; } }; struct b { void bar() { } a operator->() { return a(); } }; struct c { void qux() { } b operator->() { return b(); } }; int main() { c cobj; cobj->foo(); return 0; }Frage steht im Titel :p
-
Müsste IMO OK sein, da AFAIK beim 1. nicht überladenen legalen -> abgebrochen wird.
Da a* ein Zeiger ist kommt nach a::operator -> das erst mal der "originale" operator -> dran, über den ist foo erreichbar, passt.Müsstest du allerdings im Standard nachlesen, ich kenne den genauen Wortlaut auch nicht wie das dort steht.
Comeau Online frisst es zumindest.
Und ... hat die Frage einen bestimmten Grund?
-
der operator -> wird rekursiv auf klassentypen mit überladenem operator-> aufgerufen bis der erste echte Zeigertyp zurückgegeben wird. dies ist auch gültig bei temporären rückgabewerten, da diese erst nach beenden des ausdrucks zerstört werden, und solange haben sie eine gültige addresse.
-
bin ich der einzige, der bei solchem code magenschmerzen bekommt? Oo
-
wuaaah schrieb:
bin ich der einzige, der bei solchem code magenschmerzen bekommt? Oo
Naja, temporäre Objekte zurückgeben ist immer ein wenig kribbelig, wenn man nicht camper heißt .... aber ansonsten geht der doch (wenn auch "schön" was Anderes ist, aber das soll der Code ja auch nicht sein).
Gruß,
Simon2.