Closed t3nsor closed 2 months ago
I second this. I've run into this exact scenario with https://stackoverflow.com/a/78354636/5740428 and also concluded that it's ill-formed according to the current wording, but compilers make it work anyway (but diverge).
This should be addressed by CWG2865; if there is a remaining issue, please tell me.
Full name of submitter: Brian Bi
Reference (section label): [expr.cond]
Issue description: When a conditional expression's second and third operands have the same class type except for cv-qualification, where one is a glvalue and the other a prvalue, the result should always be a prvalue of the cv-combined type. However, the current wording doesn't always seem to yield the correct result.
Suppose the second operand is an xvalue of
const X
and the third operand is a prvalue ofX
. Under [expr.cond]/4, the conversion of the third operand toconst X&&
can be done, as it's a direct reference binding. The conversion from the second operand toX
can also be done, using the copy constructor ofX
. So this would seem to yield an ambiguity. In reality, MSVC gives an xvalue ofconst X
as the result, whereas Clang and GCC give a prvalue ofconst X
.Now suppose the second operand is an xvalue of
X
and the third operand is a prvalue ofconst X
. The conversion of the second operand toconst X
can be done. In the other direction, because there's no implicit conversion sequence from prvalue ofconst X
toX&&
, bullet 4.3.3 applies, and the target type isX
. This conversion can also be done using the copy constructor. Again the rules yield an ambiguity, but all implementations agree that the result is a prvalue ofconst X
.Suggested resolution: Add a paragraph before [expr.cond]/4: