Boost logo

Boost :

Subject: Re: [boost] [range] [1.40] iterator_range::size broken for non-random access iterators
From: Eric Niebler (eric_at_[hidden])
Date: 2009-08-21 16:57:28

Ryan Gallagher wrote:
> Eric Niebler <eric <at>> writes:
>> Ryan Gallagher wrote:
>>> We were just upgrading from 1.34.1 to 1.39.0 and I ran into this
>>> issue which I note is still in the trunk (and I would assume the
>>> 1.40 candidate).
>>> The definition of iterator_range::size is using operator- where
>>> it should be using std::distance as it did in boost 1.34 days:
> <snip>
>> This change is intentional. We decided that iterator_range::size should
>> be O(1), or else it shouldn't compile.
>> To get the old behavior, you can use boost::distance in
>> boost/range/distance.hpp.
> I never call size directly though, it's just being used through sub_range<>
> although I'm not sure why this method is being instantiated.
> I have a multi-index index on which I call equal_range. I wrapped this result
> in a sub_range<index<tag>::type> and return it. The compiler (msvc8) seems to
> complain when I assign this result to a sub_range<> instance (I don't see this
> calling size() though). I then pass it to BOOST_FOREACH -- perhaps this is
> where size() is being called. If this is the case, then BOOST_FOREACH is broken
> due to this change.

BOOST_FOREACH does not call size.

> I suppose I can change to not wrap the pair of iterators in sub_range and just
> pass them to BOOST_FOREACH as that's also a supported sequence type. It's just
> not as nice,

Please send code that reproduces the error.

Eric Niebler
BoostPro Computing

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