A *subscript expression* is a postfix expression
followed by square brackets containing
a possibly empty, comma-separated list of *initializer-clause**s*
that constitute the arguments to the subscript operator.

The *postfix-expression* and
the initialization of the object parameter of
any applicable subscript operator function is sequenced before
each expression in the *expression-list* and also before
any default argument.

The initialization of a non-object parameter of
a subscript operator function S ([over.sub]),
including every associated value computation and side effect,
is indeterminately sequenced with respect to that of
any other non-object parameter of S.

With the built-in subscript operator,
an *expression-list* shall be present,
consisting of a single *assignment-expression*.

One of the expressions shall be a glvalue of type “array of
T” or a prvalue of type “pointer
to T” and the other shall be a prvalue of unscoped enumeration or integral type.

The result is of type “T”.

The expression E1[E2] is identical (by definition) to
*((E1)+(E2)),
except that in the case of an array operand, the result is an lvalue
if that operand is an lvalue and an xvalue otherwise.