Hello, the standard defines iterator_traits with: namespace std { template<class Iterator> struct iterator_traits { typedef typename Iterator::difference_type difference_type; typedef typename Iterator::value_type value_type; typedef typename Iterator::pointer pointer; typedef typename Iterator::reference reference; typedef typename Iterator::iterator_category iterator_category; }; } plus two partial specializations for pointers. Since the typedefs are always present, iterator_traits can't be instantiated with a non-iterator template argument, and thus iterator_traits can't reliably be used in the signature of a function (it won't fall in the SFINAE category). On the other hand, if iterator_traits was specified as an empty class (no typedef) when Iterator::* don't exist (and Iterator is not a pointer), it seems to me that iterator_traits would become usable for sfinae purposes (std::distance wouldn't break user-defined distance functions any more) and no currently valid code would break. Several libraries already contain some kind of is_iterator helper; the implementation would be almost the same and the helper would become redundant. Any opinion?