24.2.1/7 Most of the library’s algorithmic templates that operate on data structures have interfaces that use ranges. A range is a pair
of iterators that designate the beginning and end of the computation.
A range[i,i)
is an empty range; in general, a range[i,j)
refers to the elements in the data structure starting with the element
pointed to byi
and up to but not including the element pointed to
byj
.
Emphasis mine.
Further, the description of erase
you cite is not the normative text in the standard. The standard has this to say (Table 100):
a.erase(q1,q2)
Effects: Erases the elements in the range [q1, q2).
This doesn’t require that q1
be dereferenceable. If [q1, q2) is an empty range (per 24.2.1/7), then no elements are in the range, and so none are erased.