The result of dereferencing a pointer-to-T is a value of type T, not
an expression of any kind.
Can you point out where in the standard it says that? I can't find it,
so I'm assuming that's what you think it should say.
It's what I thought the meaning of what is written is.
[References herewith to the N869 draft, since I don't have a
copy of the final Standard to hand. I hope nothing essential changed
since ...]
The *expression* `*p`, where `p` is of type pointer-to-T, is an
expression of type `T`.
Agreed.
If this expression is legal and defined, # its value is an instance of
type T, one of T's values.
I can't see where the standard requires that the result is a value.
The quote top of post seems accurate to the wording of 6.5.3.2#4 which
doesn't use the word value to describe the result.
Hmm. That wording appears to leave a loophole, and my wording appears to
have been unnecessarily sloppy. I'd been thinking of the `*p` expression
appearing where a value is required, but of course it can appear as the
target of an assignment [or the operand of an &], and so `*p` must
[ignoring the case of function pointers] be an lvalue, which when
evaluated will deliver some value [if that is legal].
[Assuming that the target of an assignment must be a modifiable
lvalue, it cannot be of type void by 6.3.2.1, so `*p` where `p` has
type pointer-to-void only makes sense where the value is required or
the expression contains `&*p`, so my sloppiness above doesn't seem
break the argument.]