Strange bug with iterators
I have this piece of (C++11) code:
//----------------------------------------------------------------------
#include <iterator>
template<typename Iter_t>
struct RangeWrapper
{
Iter_t mBegin, mEnd;
RangeWrapper(Iter_t b, Iter_t e): mBegin(b), mEnd(e) {}
Iter_t begin() { return mBegin; }
Iter_t end() { return mEnd; }
};
template<typename Container_t>
RangeWrapper<typename Container_t::reverse_iterator>
revRange(Container_t container)
{
return { container.rbegin(), container.rend() };
}
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v = { 1, 3, 5, 7, 9 };
for(int i: revRange(v)) std::cout << " " << i;
std::cout << "\n";
}
//----------------------------------------------------------------------
For some reason it does not work properly when compiled with gcc 4.6.3.
It prints the first numbers ok, but then it starts printing zeros.
If I compile with -D_GLIBCXX_DEBUG I get a strange runtime error:
/usr/include/c++/4.6/debug/safe_iterator.h:142:error: attempt to copy-
construct an iterator from a singular iterator.
I don't understand what that means.
When run with gdb, the backtrace indicates that the error seems to
happen in RangeWrapper::begin().