A postfix expression followed by a dot . or an arrow ->,
optionally followed by the keyword
template ([temp.names]), and then followed by an
id-expression, is a postfix expression.
The postfix
expression before the dot or arrow is evaluated;59
the result of that evaluation, together with the
id-expression, determines the result of the entire postfix
expression.
If the object expression is of scalar type,
E2 shall name the pseudo-destructor
of that same type (ignoring cv-qualifications) and
E1.E2 is an lvalue of type “function of () returning void”.
If E2 is a non-static data member and the type of
E1 is “cq1 vq1X”, and the type of E2
is “cq2 vq2T”, the expression designates the corresponding
member subobject of the object designated by the first expression.
If E1
is an lvalue, then E1.E2 is an lvalue;
otherwise E1.E2 is an xvalue.
Let the notation vq12 stand for the “union” of
vq1 and vq2; that is, if vq1 or vq2
is volatile, then vq12 is volatile.
Similarly,
let the notation cq12 stand for the “union” of cq1
and cq2; that is, if cq1 or cq2 is
const, then cq12 is const.
If E2 is
declared to be a mutable member, then the type of E1.E2
is “vq12T”.
If E2 is not declared to be a
mutable member, then the type of E1.E2 is
“cq12vq12T”.
If E2 is a non-static data member or a non-static member
function, the program is ill-formed if the class of which E2 is
directly a member is an ambiguous base ([class.member.lookup]) of
the naming class ([class.access.base]) of E2.
If the class member
access expression is evaluated, the subexpression evaluation happens even if the
result is unnecessary to determine
the value of the entire postfix expression, for example if the
id-expression denotes a static member.