A range is a sequence of elements of some specific type.
The elements of a range are said to be in the range. A forward range is a range whose first element can be accessed, and which can reduce itself to refer to all elements, except the first. A bidirectional range is a forward range whose last element can be accessed, and which can reduce itself to refer to all elements, except the last. A random-access range is a bidirectional range whose n:th element can be accessed.
The first and last elements of a range are guaranteed to exist as long as they are in the range. Actual range implementations may give additional persistence guarantees.
If a range contains no elements, then it is called empty. Every range can be queried for emptiness. The size of a range is the number of elements in the range. A size of zero is equivalent to emptiness.
If a range is infinite, or finite but of unknown size, then the size is defined as -1.
I first saw the range concept, as described here, in a presentation Iterators Must Go, by Andrei Alexandrescu, given at BoostCon 2009.