This page is a snapshot from the LWG issues list, see the Library Active Issues List for more information and the meaning of C++20 status.
Common
and CommonReference
have a common defectSection: 18.4.6 [concept.common] Status: C++20 Submitter: Casey Carter Opened: 2018-08-10 Last modified: 2021-02-25
Priority: 0
View all other issues in [concept.common].
View all issues with C++20 status.
Discussion:
The semantic requirements of both Common
(18.4.6 [concept.common]):
-2- Let
C
becommon_type_t<T, U>
. Lett
be a function whose return type isT
, and letu
be a function whose return type isU
.Common<T, U>
is satisfied only if:(2.1) —
C(t())
equalsC(t())
if and only ift()
is an equality-preserving expression (18.2 [concepts.equality]).(2.2) —
C(u())
equalsC(u())
if and only ifu()
is an equality-preserving expression (18.2 [concepts.equality]).
and similarly CommonReference
( [concept.commonreference]):
-2- Let
C
becommon_reference_t<T, U>
. Lett
be a function whose return type isT
, and letu
be a function whose return type isU
.CommonReference<T, U>
is satisfied only if:(2.1) —
C(t())
equalsC(t())
if and only ift()
is an equality-preserving expression (18.2 [concepts.equality]).(2.2) —
C(u())
equalsC(u())
if and only ifu()
is an equality-preserving expression.
don't properly reflect the intended design that conversions to the common type /
common reference type are identity-preserving: in other words, that converting
two values to the common type produces equal results if and only if the values
were initially equal. The phrasing "C(E)
equals C(E)
if and only if E
is an equality-preserving expression" is also clearly
defective regardless of the intended design: the assertion "E
is not
equality-preserving" does not imply that every evaluation of E
produces
different results.
[2018-08 Batavia Monday issue prioritization]
Priority set to 0, status to 'Tentatively Ready'
[2018-11, Adopted in San Diego]
Proposed resolution:
This wording is relative to N4762.
Modify 18.4.5 [concept.commonref] p2 as follows:
-2- Let
C
becommon_reference_t<T, U>
. Lett
be a function whose return type ist1
andt2
be equality-preserving expressions (18.2 [concepts.equality]) such thatdecltype((t1))
anddecltype((t2))
are eachT
, and letu
be a function whose return type isu1
andu2
be equality-preserving expressions such thatdecltype((u1))
anddecltype((u2))
are eachU
.T
andU
modelCommonReference<T, U>
is satisfiedonly if:(2.1) —
C(t1
equals())C(t2
if and only if())t1
equals()t2
, andis an equality-preserving expression (18.2 [concepts.equality]).(2.2) —
C(u1
equals())C(u2
if and only if())u1
equals()u2
is an equality-preserving expression.
Modify 18.4.6 [concept.common] p2 similarly:
-2- Let
C
becommon_type_t<T, U>
. Lett
be a function whose return type ist1
andt2
be equality-preserving expressions (18.2 [concepts.equality]) such thatdecltype((t1))
anddecltype((t2))
are eachT
, and letu
be a function whose return type isu1
andu2
be equality-preserving expressions such thatdecltype((u1))
anddecltype((u2))
are eachU
.T
andU
modelCommon<T, U>
is satisfiedonly if:(2.1) —
C(t1
equals())C(t2
if and only if())t1
equals()t2
, andis an equality-preserving expression (18.2 [concepts.equality]).(2.2) —
C(u1
equals())C(u2
if and only if())u1
equals()u2
is an equality-preserving expression (18.2 [concepts.equality]).