Title
Common and CommonReference have a common defect
Status
c++20
Section
[concept.common]
Submitter
Casey Carter

Created on 2018-08-10.00:00:00 last changed 45 months ago

Messages

Date: 2018-11-12.04:39:29

Proposed resolution:

This wording is relative to N4762.

  1. Modify [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 ([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 ([concepts.equality]).

    (2.2) — C(u1()) equals C(u2()) if and only if u1() equals u2 is an equality-preserving expression.

  2. Modify [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 ([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 ([concepts.equality]).

    (2.2) — C(u1()) equals C(u2()) if and only if u1() equals u2 is an equality-preserving expression ([concepts.equality]).

Date: 2018-11-12.04:39:29

[ 2018-11, Adopted in San Diego ]

Date: 2018-08-22.12:55:05

[ 2018-08 Batavia Monday issue prioritization ]

Priority set to 0, status to 'Tentatively Ready'

Date: 2018-08-10.00:00:00

The semantic requirements of both Common ([concept.common]):

-2- Let C be common_­type_­t<T, U>. Let t be a function whose return type is T, and let u be a function whose return type is U. Common<T, U> is satisfied only if:

(2.1) — C(t()) equals C(t()) if and only if t() is an equality-preserving expression ([concepts.equality]).

(2.2) — C(u()) equals C(u()) if and only if u() is an equality-preserving expression ([concepts.equality]).

and similarly CommonReference ([concept.commonreference]):

-2- Let C be common_­reference_­t<T, U>. Let t be a function whose return type is T, and let u be a function whose return type is U. CommonReference<T, U> is satisfied only if:

(2.1) — C(t()) equals C(t()) if and only if t() is an equality-preserving expression ([concepts.equality]).

(2.2) — C(u()) equals C(u()) if and only if u() 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.

History
Date User Action Args
2021-02-25 10:48:01adminsetstatus: wp -> c++20
2018-11-12 04:39:29adminsetmessages: + msg10208
2018-11-12 04:39:29adminsetstatus: voting -> wp
2018-10-08 05:13:59adminsetstatus: ready -> voting
2018-08-22 12:55:05adminsetmessages: + msg10101
2018-08-22 12:55:05adminsetstatus: new -> ready
2018-08-13 22:37:52adminsetmessages: + msg10065
2018-08-10 00:00:00admincreate