----- Original Message ----- From: "popov" <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> Sent: Tuesday, July 08, 2003 8:03 PM Subject: [boost] smart_assert and range_ template
> (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 Here I am ;-) > article is: > > http://www.cuj.com/documents/s=8464/cujcexp0308alexandr/) > > 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 { > > _STLP_DEBUG_CHECK(_Dereferenceable(*this)) > > return *this->_M_iterator; > > } > > > and STLPort outputs in the ouptut window: "STL assertion failure : > _Dereferenceable(*this)" > > 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. I think you are right. A past the end iterator should not be dereferenceable. I will modify the code, and let you know. Best, John _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost