lead me to the following question what is the type of a->x if it is not a lvalue expression ?
You are simply confused.
if the name of an object is parenthesised, it becomes an lvalue expression
That should be
if the name of an object is parenthesized, it is handled different by decltype.
Both the parenthesized and nonparenthesized things are lvalue expressions. If you don't parenthesize, then decltype does not inspect the type of the expression, but the type used by the declaration that the name lookup found the name to refer to (for example, it could be int&&
if name lookup resolves it to an rvalue reference variable, but the type of the expression is int
and is an lvalue).