### 3465. `compare_partial_order_fallback` requires `F < E`

**Section:** 17.11.6 [cmp.alg] **Status:** C++23
**Submitter:** Stephan T. Lavavej **Opened:** 2020-07-18 **Last modified:** 2023-11-22 15:47:43 UTC

**Priority: **0

**View other** active issues in [cmp.alg].

**View all other** issues in [cmp.alg].

**View all issues with** C++23 status.

**Discussion:**

`compare_partial_order_fallback` uses three expressions, but requires only two. The decayed types
of `E` and `F` are required to be identical, but variations in constness might make a difference.

*[2020-07-26; Reflector prioritization]*

Set priority to 0 and status to Tentatively Ready after seven votes in favour during reflector discussions.

*[2020-11-09 Approved In November virtual meeting. Status changed: Tentatively Ready → WP.]*

**Proposed resolution:**

This wording is relative to N4861.

Modify 17.11.6 [cmp.alg] as indicated:

-6- The name `compare_partial_order_fallback` denotes a customization point object
(16.3.3.3.5 [customization.point.object]). Given subexpressions `E` and `F`,
the expression `compare_partial_order_fallback(E, F)` is expression-equivalent
( [defns.expression-equivalent]) to:

(6.1) — If the decayed types of `E` and `F` differ,
`compare_partial_order_fallback(E, F)` is ill-formed.

(6.2) — Otherwise, `partial_order(E, F)` if it is a well-formed expression.

(6.3) — Otherwise, if the expressions `E == F`, ~~and~~
`E < F`, and `F < E` are all~~both~~ well-formed
and convertible to `bool`,

E == F ? partial_ordering::equivalent :
E < F ? partial_ordering::less :
F < E ? partial_ordering::greater :
partial_ordering::unordered

except that `E` and `F` are evaluated only once.

(6.4) — Otherwise, `compare_partial_order_fallback(E, F)` is ill-formed.