Section 21.4.1.5 of the 2011 standard states:
The char-like objects in a basic_string object shall be stored
contiguously. That is, for any basic_string object s, the identity
&*(s.begin() + n) == &*s.begin() + n shall hold for all values of
n such that 0 <= n < s.size().
The two parts of the identity expression are
- Take the
begin() iterator, advance by n, then dereference and take the address of the resulting element.
- Take the
begin() iterator, dereference and take the address of the resulting element. Add n to this pointer.
Since both are required to be identical, this enforces contiguous storage; that is, the iterator cannot move over any non-contiguous storage without violating this requirement.