warum klappt return &*it



  • rudolfi schrieb:

    warum return &*it; ?

    ja, genau. wer garantiert eigentlich, daß die datenobjekte keinen überladenen operator& haben? ims standard wird zwar auch &*it vorgeschlagen, aber ich fühle mich so ungarantiert, wenn ich das benutze.



  • void const* get_value_address() const
        {
            return &*it;
        }
    

    was hat er hier vor? er dereferenziert den iterator und nimmt die adresse?



  • rudolfi schrieb:

    was hat er hier vor? er dereferenziert den iterator und nimmt die adresse?

    ja, so nimmt er die adresse vom objekt, wo der iterator hinzeigt.

    manchmal braucht man eben die echte adresse eines objekts und nicht nur nen iterator. ok, bei std::vector dürfte der iterator eh einfach nur ein zeiger sein, da merkt man keinen unterschied. aber bei ner verketteten liste ist das schon anders, vielleicht sowas

    struct iterator{
       list<T>::node* pos;
    ...
       iterator& operatror++(){
          pos=pos->next;
       }
       T& operator*(){
          return pos->data;
       }
    };
    

  • Mod

    volkard schrieb:

    rudolfi schrieb:

    warum return &*it; ?

    ja, genau. wer garantiert eigentlich, daß die datenobjekte keinen überladenen operator& haben? ims standard wird zwar auch &*it vorgeschlagen, aber ich fühle mich so ungarantiert, wenn ich das benutze.

    soweit es sich um objekte, die mit STL-komponenten benutzt werden, so garantiert das der standard, wenn die betreffende Komponente verlangt, dass das objekt CopyConstructible ist (20.1.3)

    die ermittelung der adresse, ohne einen potentiell überladenen &-operator zu benutzen, ist bekanntlich eine recht hässliche angelegenheit:

    template<typename T>
    T* address(T& x)
    {
        return reinterpret_cast< T* >( const_cast< char* >( &reinterpret_cast< const volatile char& >( x ) ) );
    }
    


  • aha. dann werd ich wohl mal bei meinen containern auf die häßliche variante, die ich noch gar nicht kannte, umsteigen.
    thx.



  • Solltest Du ohnehin boost verwenden: boost/utility.hpp bietet ein addressof() Template dafür.


Anmelden zum Antworten