Boost logo

Boost :

From: JOAQUIN LOPEZ MU?Z (joaquin_at_[hidden])
Date: 2007-01-02 13:36:21

----- Mensaje original -----
De: Thorsten Ottosen <thorsten.ottosen_at_[hidden]>
Fecha: Martes, Enero 2, 2007 6:44 pm
Asunto: Re: [boost] Weird behaviour/bug in ptr_map
Para: boost_at_[hidden]

> Thorsten Ottosen wrote:
> > Joshua Moore-Oliva wrote:
> > It appears that every single erase (including that done by
> >a key) has an assert for the
> >list not being empty!
> I could not see that assertion in the 1.34 RC branch? Are your
> examples
> from 1.33?
> Here's the definition from 1.34:
> size_type erase( const key_type& x ) // nothrow
> {
> iterator i( this->c_private().find( x ) ); // nothrow
> if( i == this->end() ) // nothrow
> return 0u; // nothrow
> this->remove( i ); // nothrow
> return this->c_private().erase( x ); // nothrow
> }
> This works fine if the map is empty.

Hello Thorsten, this issue was already raised and corrected
on September 2005, you might want to consult the thread at .

> Wheter the overload that takes an iterator should be allowed to
> accept the end iterator is another issue. I'll give it some
> thought.

My humble opinion is that you shouldn't allow an an end iterator
to be legally passed to erase(iterator), that is, your current

  BOOST_ASSERT( before != this->end() );

is conformig. The rational is that erase(end()) is illegal, or
at least undefined behavior, in STL containers.

The additional check

  BOOST_ASSERT( !this->empty() );

at the same member function is almost immaterial, since if
the container is empty then end() is the only valid iterator
that can be possibly passed in.


Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo

Boost list run by bdawes at, gregod at, cpdaniel at, john at