forward list patch

François Dumont
Tue Oct 26 20:44:00 GMT 2010

On 10/25/2010 10:13 PM, Paolo Carlini wrote:
> Maybe I didn't clearly make my point: I suspect that the standard should
> be changed to explicitly say that the iterator returned by before_begin
> can be invalidated by swap. Assuming that is the case, do we have to go
> through special contortions in forward_list? Also note that in all my
> tests just incrementing such iterator after the swap leads to a behavior
> in debug mode indistinguishable from normal-mode. Eg, things like:
>    std::forward_list<int>  fl1(10, 0);
>    std::forward_list<int>  fl2(10, 1);
>    auto it1_b = fl1.before_begin();
>    auto it1_e = fl1.end();
>    fl1.swap(fl2);
>    ++it1_b;
>    for (auto it = it1_b; it != it1_e; ++it)
>      std::cout<<  *it<<  std::endl;
> work already perfectly well. I'm not convinced we need all that code in
> <forward_list>.
And the result of this code is a bunch of '1' so it means that it1_b is 
still pointing to fl1 list. But if you add a small check after the swap 

VERIFY( it1_b == it1.before_begin() )

and run it in debug mode then the execution will fail with a message 
saying that you try to compare iterators from different sequence.

I will try to think about what could be done if the Standard say that we 
can invalidate before begin on swap but franckly I don't see the point 
of considering the before begin as invalid if the underlying normal 
iterator is not. Do you also thing that normal implementation should be 
changed too so that normal before begin cannot be used anymore ? Or that 
after the swap it1_b points to fl2 ?


More information about the Libstdc++ mailing list