
Hi, Assume a base iterator is an InputIterator with RandomAccessTraversalTag. boost::make_zip_iterator often returns such iterators. boost::transform_iterator sometimes resurrects lvalue-ness of its base iterator. For example, char & to_lvalue(boost::tuple<char &, int &> const &t) { return boost::get<0>(t); } can return a lvalue from zip_iterator dereference. Therefore, if boost::transform_iterator extracts "pure" traversal tag from its base iterator, it can be not an InputIterator but a RandomAccessIterator. The patch will be something like this: template <class UnaryFunc, class Iterator, class Reference, class Value> struct transform_iterator_base { // ... typedef iterator_adaptor< transform_iterator<UnaryFunc, Iterator, Reference, Value> , Iterator , cv_value_type - , use_default // Leave the traversal category alone + , typename pure_traversal_tag<typename iterator_traversal<Iterator>::type>::type , reference > type; }; } Is there any pitfalls? Regards, -- Shunsuke Sogame