Starting from C++14 we have that:
ForwardIteratorbehaves like the past-the-end iterator of some unspecified empty container: it compares equal to all value-initialized
ForwardIteratorsof the same type.
This answer on SO explains this well:
Forward iterators and stronger are generally just a lightweight handle onto something else (e.g. a pointer to an element or a node in a container) and so there is little reason not to require that they can be default constructed
I would say that this has also to do with the notion of regular types, as well as the inconvenience of checking at run-time for a sentinel value.