how is the expression evaluated?
warning: unnecessary details follow
1. The subexpression 'n' is evaluated. It results in lvalue Test
2. The subexpression 'p' is evaluated. It results in lvalue pointer-to-member-of-Test
3. lvalue-to-rvalue implicit conversion is applied to the result of 2, this reads the value of the pointer (from RAM to CPU, essentially)
4. operator .* is evaluated. It results in lvalue int* (it always returns the value category of its left operand) which identifies the actual member subobject of n
5. lvalue-to-rvalue implicit conversion is applied to the result of 4, this reads the value of the member subobject (e.g. the address stored in that pointer is loaded from RAM to CPU)
6. operator* is evaluated: it identifies the object stored at the address that was obtained in 5. The result is an lvalue of type int which identifies the pointed-to integer.
My numbering does not reflect the order of evaluation: 1 can happen after 2 or after 3 (but always before 4)
Maybe you can help me with something quick. I'm seeing what is and isn't possible with pointers-to-members. So I tried a pointer-to-a-member-pointer-to-a-function. That didn't go so well; I got the syntax wrong. I initially thought it would be this: