Boost logo

Boost :

From: popov (boost_at_[hidden])
Date: 2003-07-08 12:03:10

(not sure it's the right place to post this, but it seems smart_assert is
(or will) be part of boost, and I can't get the author email addresses. The
article is:

Here's an excerpt of some code:

template< class iterator_type>

inline client_ostream_type & operator<<( client_ostream_type & out, const
printer_range_t< iterator_type> &val) {

out << "Range= [" << &*(val.m_first) << "," << &*( val.m_last) << "); "

<< "Values= [";

val.m_first and val.m_last are STL iterators.

The problem is with *(val.m_last) (or *(val.m_first)): if val.m_last is the
end iterator of a container, can we safely dereference it as it is done ?
What the standard is saying about that one ?

The code works properly with Microsoft STL, but fails using STLPort in debug
mode: in this latter case, the program asserts and stops at:

reference operator*() const {


return *this->_M_iterator;


and STLPort outputs in the ouptut window: "STL assertion failure :

So, for STLPort, an iterator pointing to the end of a container can't be
dereferenced. That seems judicious to me, but is it in accordance with the
standard ?

If it's the case, then there is a problem in the smart_assert code.

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