Details
-
Bug
-
Status: Open
-
Minor
-
Resolution: Unresolved
-
4.1.2, 4.1.3, 4.1.4, 4.2.0, 4.2.1
-
None
-
Incorrect Behavior
Description
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 ()
reference operator*()
{ return cache; }Iterator& operator++()
{ cache = *++cur; return *this; }Iterator& operator--()
{ cache = *--cur; return *this; }};
int main ()
{
int a[] =
;
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