From: Daniel Walker (daniel.j.walker_at_[hidden])
Date: 2006-05-23 14:20:15
On 5/23/06, Shunsuke Sogame <mb2act_at_[hidden]> wrote:
> Daniel Walker wrote:
> > On 5/23/06, Shunsuke Sogame <mb2act_at_[hidden]> wrote:
> >> BTW, I found a bug:
> >> <boost/range/concepts.hpp> seems to
> >> apply 'boost::size' to Forward Range.
> > If I recall correctly applying boost::size() was intentional. size(r)
> > is a valid expression for the ForwardRange concept, and I believe
> > Thorsten didn't want ADL to kick in, so in the concept check
> > implementation boost:: is used to qualify all the functions.
> > boost::size() eventually dispatches either a size() member of the
> > range object or std::distance().
> Updated cvs shows 'boost::size' uses 'operator-' ?
> I somewhat wonder why 'boost::size' and
> 'boost::range_size' are not deprecated
> like 'boost::range_result_iterator'.
My bad. I just got the new range files (very busy the last few weeks)
and there is a bug here.
Actually, I think this is a case of the concept checks reveling a bug
in the library. The following generates the error you're seeing.
using namespace boost;
using namespace std;
typedef iterator_range<iterator_type> range_type;
The problem is that the ForwardRange concept requires the expression
size(r) where r is an object of type X modeling ForwardRange and
boost::range_iterator<X>::type is a model of ForwardTraversalIterator.
However, the implementation of boost::size(r) expects X to provide
operator-, which is an expression of RandomAccessTraversalIterator.
So, I think either size(r) should be removed from the FowardRange
concept (bad idea), or boost::size(r) should either offer a
specialization for ForwardRanges or revert to dispatching the call to
std::distance() (better idea?).
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk