Random Access Traversal Concept

A class or built-in type X models the Random Access Traversal concept if the following expressions are valid and respect the stated semantics. In the table below, Distance is iterator_traits<X>::difference_type and n represents a constant object of type Distance.

Random Access Traversal Iterator Requirements (in addition to Bidirectional Traversal)
Expression Return Type Operational Semantics Assertion/ Precondition
r += n X&
{
  Distance m = n;
  if (m >= 0)
    while (m--)
      ++r;
  else
    while (m++)
      --r;
  return r;
}
 
a + n, n + a X { X tmp = a; return tmp += n; }  
r -= n X& return r += -n  
a - n X { X tmp = a; return tmp -= n; }  
b - a Distance a < b ?  distance(a,b) : -distance(b,a) pre: there exists a value n of Distance such that a + n == b. b == a + (b - a).
a[n] convertible to T *(a + n) pre: a is a Readable Iterator
a[n] = v convertible to T *(a + n) = v pre: a is a Writable iterator
a < b convertible to bool b - a > 0 < is a total ordering relation
a > b convertible to bool b < a > is a total ordering relation
a >= b convertible to bool !(a < b)  
a <= b convertible to bool !(a > b)  
iterator_traversal<X>::type Convertible to random_access_traversal_tag