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 an array element i
of an array object x with n elements ([dcl.array]),80
the expressions P + J and J + P
(where J has the value j)
point to the (possibly-hypothetical) array element
i+j of x if 0≤i+j≤n
and the expression P - J
points to the (possibly-hypothetical) array element
i−j of x 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>