https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71771
--- Comment #4 from Jonathan Wakely <redi at gcc dot gnu.org> --- This fails without the single-type overloads: #include <iterator> namespace greedy { struct X { }; template<typename T> X operator-(T, T) { return {}; } } int main() { std::move_iterator<greedy::X*> m{nullptr}; m - m; std::reverse_iterator<greedy::X*> r{nullptr}; r - r; } Whether we still care about such unconstrained templates is another matter.