classes containing a sequence of objects of various types ([class]),
a set of types, enumerations and functions for
manipulating these objects ([class.mfct]), and a set of restrictions
on the access to these entities ([class.access]);

A value of a
pointer type
that is a pointer to or past the end of an object
represents the address of
the first byte in memory ([intro.memory]) occupied by the object50
or the first byte in memory
after the end of the storage occupied by the object,
respectively.

A pointer past the end of an object ([expr.add])
is not considered to point to an unrelated object
of the object's type
that might be located at that address.

A pointer value becomes invalid
when the storage it denotes
reaches the end of its storage duration;
see [basic.stc].

—end note

]

For purposes of pointer arithmetic ([expr.add])
and comparison ([expr.rel], [expr.eq]),
a pointer past the end of the last element of
an array x of n elements
is considered to be equivalent to
a pointer to a hypothetical element x[n].

one is a standard-layout class object and
the other is the first non-static data member of that object, or,
if the object has no non-static data members,
the first base class subobject of that object ([class.mem]), or