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;67
the result of that evaluation, together with the
id-expression, determines the result of the entire postfix
expression.
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 named
member 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 (possibly overloaded) member function, function
overload resolution ([over.match]) is used to determine whether
E1.E2 refers to a static or a non-static member function.
If it refers to a static member function and the type of
E2 is “function of parameter-type-list returning T”,
then E1.E2 is an lvalue; the expression designates the static
member function.
The type of E1.E2 is the same type as that of
E2, namely “function of parameter-type-list returning
T”.
Otherwise, if E1.E2 refers to a non-static member
function and the type of E2 is “function of
parameter-type-list cvref-qualifier returning T”, then
E1.E2 is a prvalue.
The expression designates a
non-static member function.
The expression can be used only as the
left-hand operand of a member function call ([class.mfct]).
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.