mehrfaches ausführen des ->Operators durch compiler
-
Lt. Modern c++-Design ruft der Compiler den '->'-Operator rekursiv auf, bis er bei nem echten Zeiger ist.
the mechanics of operator->, that the compiler can apply operator-> multiple times to one -> expression, until it reaches a native pointer.
Dann müsste doch eigentlich folgendes funzen
std::auto_ptr< std::auto_ptr< std::string> > aptr; aptr->size(); //statt (*aptr)->size();
Das übersetzt aber nichtmal er comeau-Compiler. Versteh ichs falsch?
-
kartoffelsack schrieb:
Das übersetzt aber nichtmal er comeau-Compiler. Versteh ichs falsch?
std::auto_ptr speichert T * und nicht T,
versuch mal so zu verstehen:std::auto_ptr<std::string> *ptr; ptr->size(); //error C2039: 'size' : is not a member of 'std::auto_ptr<_Ty>'
-
D.h. dass das erste -> bereits auf einen 'native'-Pointer zeigt, und der ist auto_ptr<string>*. Und deswegen wird das nicht weiter aufgelöst?
ok. Soweit klar
Aber
Dann müsste doch folgendes funzen:#include <list> #include <string> void foo() { std::list< std::list<std::string*>::iterator> lst; (*(*lst.begin()))->size(); //ok //lst.begin()->size(); //fehler }
-
kartoffelsack schrieb:
D.h. dass das erste -> bereits auf einen 'native'-Pointer zeigt, und der ist auto_ptr<string>*. Und deswegen wird das nicht weiter aufgelöst?
ok. Soweit klar
Aber
Dann müsste doch folgendes funzen:#include <list> #include <string> void foo() { std::list< std::list<std::string*>::iterator> lst; (*(*lst.begin()))->size(); //ok //lst.begin()->size(); //fehler }
Nö. Ist doch letztlich genau die gleiche Situation. iterator::operator-> liefert einen Zeiger auf den value_type.
In diesem Fall hast du iterator<std::list<string*>::iterator>::operator->. Der value_type ist std::list<string*>::iterator also liefert der op-> ein
std::list<string*>::iterator*. Bei diesem Zeiger endet der op-> dann ohne eine Methode size zu finden.Ähnliches Problem:
std::list<string*>::iterator->size()
Hier ist das Ergebnis des operator-> ein string**. Und dafür gibt es keinen op->.
-
guck mal was
std::list::iterator::operator->()
zurückgibt
-
ok, ihr habt mich überzeugt