**Section:** 18.4.6 [concept.common] **Status:** C++20
**Submitter:** Casey Carter **Opened:** 2018-08-10 **Last modified:** 2021-02-25 10:48:01 UTC

**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

Cbecommon_type_t<T, U>. Lettbe a function whose return type isT, and letube 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

Cbecommon_reference_t<T, U>. Lettbe a function whose return type isT, and letube 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`be`common_reference_t<T, U>`. Let`t`be a function whose return type is`t1`and`t2`be equality-preserving expressions (18.2 [concepts.equality]) such that`decltype((t1))`and`decltype((t2))`are each`T`, and let`u`be a function whose return type is`u1`and`u2`be equality-preserving expressions such that`decltype((u1))`and`decltype((u2))`are each`U`.`T`and`U`model`CommonReference<T, U>`~~is satisfied~~only if:(2.1) —

`C(t1`equals~~()~~)`C(t2`if and only if~~()~~)`t1`equals~~()~~`t2`, and~~is 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`be`common_type_t<T, U>`. Let`t`be a function whose return type is`t1`and`t2`be equality-preserving expressions (18.2 [concepts.equality]) such that`decltype((t1))`and`decltype((t2))`are each`T`, and let`u`be a function whose return type is`u1`and`u2`be equality-preserving expressions such that`decltype((u1))`and`decltype((u2))`are each`U`.`T`and`U`model`Common<T, U>`~~is satisfied~~only if:(2.1) —

`C(t1`equals~~()~~)`C(t2`if and only if~~()~~)`t1`equals~~()~~`t2`, and~~is 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])~~.