I'm pretty sure all that "new" quote adds is that *vptr
is an lvalue expression with type volatile char
.
The type of the lvalue doesn't affect the type of the object to which that lvalue expression refers, for the same reason that a pointer-to-const that points at a non-const object doesn't somehow make the object const. So the original analysis isn't affected this quote -- the object still doesn't have volatile-qualified type.
In normal parlance we'd say that the type of *vptr
is volatile char &
, but 5/5 says, "If an expression initially has the type “reference to T” the type is adjusted to T prior to any further analysis". That's the reason why *vptr
is said to have type volatile char
, not volatile char &
-- before analysing any expression you remove the reference from the type, even if it's an lvalue.
[Edit: my answer used to have some text about cv-qualifications being insignificant for non-object values of integer type. It was true (lvalue-to-rvalue conversions of non-class types discard cv-qualifiers, 4.1/1) but irrelevant (I mistakenly thought that because the text you quoted mentioned a non-reference type it was talking about the type after this conversion)]