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 👍


Anmelden zum Antworten