Does the problem lie with iterator_category_with_traversal? It looks like it's intended in this case to be convertible to either std::input_iterator_tag or std::random_access_iterator_tag, but clearly something is wrong with the latter conversion. Any ideas?
The problem lies in the fact that your iterator when it calls `dereference()`, returns something that is not a reference(ie char). For it to be a `std::random_access_iterator_tag` it must a reference. That is, `iterator_traits<X>::reference` must be an actual reference. So therefore your iterator is given the `std::input_iterator_tag`, since it is the only iterator category that doesn't require `dereference()` to return a reference. So then when you call:
std::advance(it, -1);
With an input iterator, it will, depending on the implementation and the build type, either fail with a runtime assertion, or go into an infinite loop. Thanks, Paul