For addition, either both operands shall have arithmetic or unscoped enumeration
type, or one operand shall be a pointer to a completely-defined object
type and the other shall have integral or unscoped enumeration type.
Otherwise, if P points to element x[i]
of an array object x with n elements,81
the expressions P + J and J + P
(where J has the value j)
point to the (possibly-hypothetical) element
x[i+j] if 0≤i+j≤n
and the expression P - J
points to the (possibly-hypothetical) element
x[i−j] if 0≤i−j≤n.
When two pointer expressions P and Q are subtracted,
the type of the result is an implementation-defined signed
integral type; this type shall be the same type that is defined as
std::ptrdiff_t in the <cstddef>