[ 
https://issues.apache.org/jira/browse/STDCXX-635?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#action_12539602
 ] 

Farid Zaripov commented on STDCXX-635:
--------------------------------------

Personally, I don't think that this is a bug.

After swap operation the d1.begin() == d1.end() and they are valid end 
iterators for the d1 (d2.begin() == d2.end() and they are valid end iterators 
for the d2). The only thing that was changes is the binary representation of 
the iterators, so that operator==(d1.begin() before swap, d2.begin() after 
swap) returns false.

BTW the Dinkumware STL has the same behavior even on non-empty deque's, because 
its std::deque::iterator has member deque*_Mycont, so the before swap 
d1.begin()._Mycont == &d1; after swap d2.begin()._Mycont == &d2; and as a 
result d1.begin() != d2.begin() in any case.


> std::deque::swap invalidates begin() and end() iterators on empty container
> ---------------------------------------------------------------------------
>
>                 Key: STDCXX-635
>                 URL: https://issues.apache.org/jira/browse/STDCXX-635
>             Project: C++ Standard Library
>          Issue Type: Bug
>          Components: 23. Containers
>    Affects Versions: 4.2
>         Environment: All
>            Reporter: Farid Zaripov
>            Priority: Minor
>             Fix For: 4.2.1
>
>
> The program below aborts on assert.
> #include <deque>
> #include <cassert>
> int main ()
> {
>     typedef std::deque<int> Deque;
>     typedef Deque::iterator Iter;
>     Deque d1, d2;
>     Iter iters [2][2] = {
>         { d1.begin (), d1.end () },
>         { d2.begin (), d2.end () }
>     };
>     d1.swap (d2);
>     assert (d2.begin () == iters [0][0]);
>     assert (d2.end ()== iters [0][1]);
>     assert (d1.begin () == iters [1][0]);
>     assert (d1.end ()== iters [1][1]);
>     return 0;
> }

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to