iter_swapping vector<bool>::iterator..
Paolo Carlini
pcarlini@suse.de
Fri Mar 18 15:47:00 GMT 2005
Chris Jefferson wrote:
> Sorry, I'll provide a bit more detail this time!
Thanks and sorry about my harsh reply: I become *very* nervous when I
snif regressions...
> The problem is that vector<bool>::iterator returns a temporary
> _Bit_Reference rather than a "proper" reference. If iter_swap is
> defined as:
>
> void iter_swap(A a,B b) { swap(*a,*b); }
>
> then as swap is defined as "void swap(T& t,U &u);", then you get the
> error:
>
> invalid initialization of non-const reference of type
> 'std::_Bit_reference' from a temporary of type 'std::_Bit_reference'
Ok, got it.
> According to my reading of the standard, the new behaviour is correct as
> according to Table 47, a forward iterator must for "*a" return "T&", and
> iter_swap only claims to work on forward iterators.
Table 74, got it...
> Vector<bool> isn't a
> proper container and it's iterators don't satisfy the conditions for
> forward iterators.
This is not at all *obvious*. I understand what you mean by "isn't a
proper container",
this a *well* known issue, in general. The *specific* issue, new to me,
is that its
iterators don't satisfy the forward iterator requirements. Therefore, I
agree that we
are entitled to not iter_swap those iterators. Still, I'm not sure if
users understand
this *long standing* issue with (our implementation) of
vector<bool>::iterator. Also,
I'm not sure whether this is actually a bug of our implementation of
vector<bool>.
What do other people think?
In short, my current position is that would be stupid reverting the
iter_swap changes
because of this, but maybe we should document the behavior somehow or even
reconsider our implementation of vector<bool>::iterator itself.
Anyone knows whether other implementors are able to provide a
vector<bool>::iterator
which meets the forward iterator requirements? Everything really boils
down to this,
in my opinion.
Paolo.
More information about the Libstdc++
mailing list