
Boost : 
From: David Abrahams (dave_at_[hidden])
Date: 20040223 07:08:26
Gabriel Dos Reis <gdr_at_[hidden]> writes:
> David Abrahams <dave_at_[hidden]> writes:
>
>  Daniel Frey <daniel.frey_at_[hidden]> writes:
> 
>  > Consider:
>  >
>  > // A strange way to retrieve my_container.begin():
>  > boost::prior( my_container.end(), my_container.size() );
>  >
>  > Is that legal? The second template parameter of boost::prior is
>  > deduced to an unsigned(!) type, which IMHO means that n is undefined,
>  > right? Do we need to fix this? Maybe:
>  >
>  > template <class T>
>  > T prior(T x, typename T::difference_type n)
>  > {
>  > std::advance(x, n);
>  > return x;
>  > }
> 
>  Well, that wouldn't work!
>  How would you call prior(p, 4) when p is int*?
>
> I suppose he wanted to say
>
> template<class T>
> T prior(T x, typename std::iterator_traits<T>::different_type n)
>
> ?
>
>  > or shall we document that it's illegal/undefined to call
>  > boost::prior() with an unsigned second parameter?
> 
>  Hmm, no I think if it's unsigned we should either deduce an
>  appropriate signed type or implement the "backward advance"
>  ourselves. We could use reverse_iterator to do that, FWIW.
>
> That would be an isomorphic implementation, indeed.
>
Hey! These implementations using "advance" don't work for
noniterators (e.g. int) the way regular next() and prior() do. I
consider this a bug!
 Dave Abrahams Boost Consulting www.boostconsulting.com
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk