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