Proposed resolution (December, 2011): Change 7.2.1 [basic.lval] paragraph 4 as
follows (supersedes the corresponding change in the resolution of
issue 1059): Add a new paragraph following Clause 7 [expr] paragraph 5:
If an expression initially has the type “reference to
T ”... If a prvalue initially has the type “cv
T ,” where T is a cv-unqualified
non-class, non-array type, the type of the expression is adjusted
to T prior to any further analysis. Change 7.6.1.3 [expr.call] paragraph 3 as follows: Change 7.6.1.4 [expr.type.conv] paragraph 2 as follows: Change 7.6.3 [expr.cast] paragraph 1 as follows:
Class prvalues can have cv-qualified types; non-class
prvalues always have cv-unqualified types. Unless otherwise
indicated (7.6.1.3 [expr.call]), prvalues shall always
have complete types or the void type; in addition to
these types, glvalues can also have incomplete types.
[Note: class and array prvalues can have cv-qualified
types; other prvalues always have cv-unqualified types. See
Clause 7 [expr]. —end note]
If the postfix-expression designates a destructor
(11.4.7 [class.dtor]), the type of the function call
expression is void ; otherwise, the type of the function
call expression is the return type of the statically chosen
function (i.e., ignoring the virtual keyword), even if
the type of the function actually called is different. This
return type shall be an object type, a reference type
or
the type cv void .
...[Note: if T is a non-class type that is cv-qualified, the
cv-qualifiers are
ignored discarded
when determining the type of the resulting prvalue
(7.2.1 [basic.lval]
Clause 7 [expr]). —end note]
...[Note: if T is a non-class type that is
cv-qualified cv-qualified, the
cv-qualifiers are ignored discarded
when determining the type of the resulting prvalue; see
7.2.1 [basic.lval]
Clause 7 [expr]. —end note]