[LWG #198] std::reverse_iterator::operator*() invalidates cached values
-----------------------------------------------------------------------

                 Key: STDCXX-690
                 URL: https://issues.apache.org/jira/browse/STDCXX-690
             Project: C++ Standard Library
          Issue Type: Bug
          Components: 24. Iterators
    Affects Versions: 4.2.0, 4.1.4, 4.1.3, 4.1.2
            Reporter: Martin Sebor


According to LWG issue 198 
(http://www.open-std.org/jtc1/sc22/wg21/docs/lwg-defects.html#198), the 
implementation of reverse_iterator::operator*() should cache the "base" 
iterator to prevent dangling references to values cached by it. The test case 
below demonstrates the problem caused by not doing so:

$ cat t.cpp && make t && ./t
#include <cassert>
#include <iterator>

struct Iterator: std::iterator<std::random_access_iterator_tag, int>
{
    int *cur;
    int cache;

    Iterator (int *p = 0): cur (p) { }
    ~Iterator () { cache = ~cache; }

    reference operator*() { return cache; }

    Iterator& operator++() { cache = *++cur; return *this; }
    Iterator& operator--() { cache = *--cur; return *this; }
};


int main ()
{
    int a[] = { 1, 2, 3 };
    Iterator it (a + sizeof a / sizeof *a);
    std::reverse_iterator<Iterator> rit (it);

    const int &ref = *rit;
    const int val = ref;

    ++rit;
    assert (val == ref);
}
gcc -c -I/home/sebor/stdcxx/include/ansi -D_RWSTDDEBUG   -pthread 
-I/home/sebor/stdcxx/include -I/build/sebor/stdcxx-gcc-4.1.2-15D/include 
-I/home/sebor/stdcxx/examples/include  -pedantic -nostdinc++ -g   -W -Wall 
-Wcast-qual -Winline -Wshadow -Wwrite-strings -Wno-long-long -Wcast-align   
t.cpp
gcc t.o -o t -pthread  -L/build/sebor/stdcxx-gcc-4.1.2-15D/lib  
-Wl,-R/build/sebor/stdcxx-gcc-4.1.2-15D/lib -lstd15D -lsupc++ -lm 
t: t.cpp:29: int main(): Assertion `val == ref' failed.
Aborted


-- 
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