Ist das Dekrementieren eines Iterators auf das Ende einer Liste erlaubt?



  • Hallo,

    ist das Dekrementieren eines Iterators auf das Ende einer Liste laut Standard erlaubt? Ich bin mir bei folgendem Quelltext, nicht sicher, ob ein undefiniertes Verhalten vorliegt:

    std::list<int> coll;
      coll.push_back(32);
      coll.push_back(22);
      std::list<int>::iterator it = coll.begin();
      BOOST_CHECK( *it == 32 );
      ++it;
      BOOST_CHECK( *it == 22 );
      ++it;
      BOOST_CHECK( it == coll.end() );
      --it;
      BOOST_CHECK( *it == 22 );
    

    Da ja iterator::end() einen iterator auf das Element nach dem Letzten zeigt, darf man ihn ja nicht derefenzieren. Bei einem --it passiert ja intern so etwas wie:

    p = p->prev;
    

    Es findet ein Derefenzieren des zugrundeliegenden Zeigers statt und das sollte doch schief gehen, oder? Oder wird das intern abgefangen und ein iterator auf das letzte Element zurückgegeben, so dass ein Dekrementieren auf einen end-iterator definiert ist?

    Gruß



  • Du verwechselst Iterator und Wert. Zugriff auf den Wert ( *it ) ist verboten. Der Wert enthält ja aber auch keinen 'prev'-Zeiger sondern der Iterator enthält einen.


Anmelden zum Antworten