Files
2025-10-25 03:02:53 +03:00

282 lines
10 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[cmp.alg]
# 17 Language support library [[support]](./#support)
## 17.12 Comparisons [[cmp]](cmp#alg)
### 17.12.6 Comparison algorithms [cmp.alg]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L5480)
The name strong_order denotes
a customization point object ([[customization.point.object]](customization.point.object "16.3.3.3.5Customization Point Object types"))[.](#1.sentence-1)
Given subexpressions E and F,
the expression strong_order(E, F) is expression-equivalent ([[defns.expression.equivalent]](defns.expression.equivalent "3.22expression-equivalent")) to the following:
- [(1.1)](#1.1)
If the decayed types of E and F differ, strong_order(E, F) is ill-formed[.](#1.1.sentence-1)
- [(1.2)](#1.2)
Otherwise, strong_ordering(strong_order(E, F)) if it is a well-formed expression
where the meaning of strong_order is established as-if by performing
argument-dependent lookup only ([[basic.lookup.argdep]](basic.lookup.argdep "6.5.4Argument-dependent name lookup"))[.](#1.2.sentence-1)
- [(1.3)](#1.3)
Otherwise, if the decayed type T of E is
a floating-point type,
yields a value of type strong_ordering that is consistent with the ordering
observed by T's comparison operators, and
if numeric_limits<T>::is_iec559 is true,
is additionally consistent with the totalOrder operation
as specified in ISO/IEC 60559[.](#1.3.sentence-1)
- [(1.4)](#1.4)
Otherwise, strong_ordering(compare_three_way()(E, F)) if it is a well-formed expression[.](#1.4.sentence-1)
- [(1.5)](#1.5)
Otherwise, strong_order(E, F) is ill-formed[.](#1.5.sentence-1)
[*Note [1](#note-1)*:
Ill-formed cases above result in substitution failure
when strong_order(E, F) appears in the immediate context
of a template instantiation[.](#1.sentence-3)
— *end note*]
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L5518)
The name weak_order denotes
a customization point object ([[customization.point.object]](customization.point.object "16.3.3.3.5Customization Point Object types"))[.](#2.sentence-1)
Given subexpressions E and F,
the expression weak_order(E, F) is expression-equivalent ([[defns.expression.equivalent]](defns.expression.equivalent "3.22expression-equivalent")) to the following:
- [(2.1)](#2.1)
If the decayed types of E and F differ, weak_order(E, F) is ill-formed[.](#2.1.sentence-1)
- [(2.2)](#2.2)
Otherwise, weak_ordering(weak_order(E, F)) if it is a well-formed expression
where the meaning of weak_order is established as-if by performing
argument-dependent lookup only ([[basic.lookup.argdep]](basic.lookup.argdep "6.5.4Argument-dependent name lookup"))[.](#2.2.sentence-1)
- [(2.3)](#2.3)
Otherwise, if the decayed type T of E is a floating-point type,
yields a value of type weak_ordering that is consistent with the ordering
observed by T's comparison operators and strong_order, and
if numeric_limits<T>::is_iec559 is true,
is additionally consistent with the following equivalence classes,
ordered from lesser to greater:
* [(2.3.1)](#2.3.1)
together, all negative NaN values;
* [(2.3.2)](#2.3.2)
negative infinity;
* [(2.3.3)](#2.3.3)
each normal negative value;
* [(2.3.4)](#2.3.4)
each subnormal negative value;
* [(2.3.5)](#2.3.5)
together, both zero values;
* [(2.3.6)](#2.3.6)
each subnormal positive value;
* [(2.3.7)](#2.3.7)
each normal positive value;
* [(2.3.8)](#2.3.8)
positive infinity;
* [(2.3.9)](#2.3.9)
together, all positive NaN values[.](#2.3.sentence-1)
- [(2.4)](#2.4)
Otherwise, weak_ordering(compare_three_way()(E, F)) if it is a well-formed expression[.](#2.4.sentence-1)
- [(2.5)](#2.5)
Otherwise, weak_ordering(strong_order(E, F)) if it is a well-formed expression[.](#2.5.sentence-1)
- [(2.6)](#2.6)
Otherwise, weak_order(E, F) is ill-formed[.](#2.6.sentence-1)
[*Note [2](#note-2)*:
Ill-formed cases above result in substitution failure
when weak_order(E, F) appears in the immediate context
of a template instantiation[.](#2.sentence-3)
— *end note*]
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L5570)
The name partial_order denotes
a customization point object ([[customization.point.object]](customization.point.object "16.3.3.3.5Customization Point Object types"))[.](#3.sentence-1)
Given subexpressions E and F,
the expression partial_order(E, F) is expression-equivalent ([[defns.expression.equivalent]](defns.expression.equivalent "3.22expression-equivalent")) to the following:
- [(3.1)](#3.1)
If the decayed types of E and F differ, partial_order(E, F) is ill-formed[.](#3.1.sentence-1)
- [(3.2)](#3.2)
Otherwise, partial_ordering(partial_order(E, F)) if it is a well-formed expression
where the meaning of partial_order is established as-if by performing
argument-dependent lookup only ([[basic.lookup.argdep]](basic.lookup.argdep "6.5.4Argument-dependent name lookup"))[.](#3.2.sentence-1)
- [(3.3)](#3.3)
Otherwise, partial_ordering(compare_three_way()(E, F)) if it is a well-formed expression[.](#3.3.sentence-1)
- [(3.4)](#3.4)
Otherwise, partial_ordering(weak_order(E, F)) if it is a well-formed expression[.](#3.4.sentence-1)
- [(3.5)](#3.5)
Otherwise, partial_order(E, F) is ill-formed[.](#3.5.sentence-1)
[*Note [3](#note-3)*:
Ill-formed cases above result in substitution failure
when partial_order(E, F) appears in the immediate context
of a template instantiation[.](#3.sentence-3)
— *end note*]
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L5602)
The name compare_strong_order_fallback denotes a customization point object ([[customization.point.object]](customization.point.object "16.3.3.3.5Customization Point Object types"))[.](#4.sentence-1)
Given subexpressions E and F,
the expression compare_strong_order_fallback(E, F) is expression-equivalent ([[defns.expression.equivalent]](defns.expression.equivalent "3.22expression-equivalent")) to:
- [(4.1)](#4.1)
If the decayed types of E and F differ, compare_strong_order_fallback(E, F) is ill-formed[.](#4.1.sentence-1)
- [(4.2)](#4.2)
Otherwise, strong_order(E, F) if it is a well-formed expression[.](#4.2.sentence-1)
- [(4.3)](#4.3)
Otherwise, if the expressions E == F and E < F are both well-formed and
each of decltype(E == F) and decltype(E < F) models [*boolean-testable*](concept.booleantestable#concept:boolean-testable "18.5.2Boolean testability[concept.booleantestable]"),E == F ? strong_ordering::equal : E < F ? strong_ordering::less : strong_ordering::greater except that E and F are evaluated only once[.](#4.3.sentence-1)
- [(4.4)](#4.4)
Otherwise, compare_strong_order_fallback(E, F) is ill-formed[.](#4.4.sentence-1)
[*Note [4](#note-4)*:
Ill-formed cases above result in substitution failure
when compare_strong_order_fallback(E, F) appears in the immediate context
of a template instantiation[.](#4.sentence-3)
— *end note*]
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L5636)
The name compare_weak_order_fallback denotes
a customization point object ([[customization.point.object]](customization.point.object "16.3.3.3.5Customization Point Object types"))[.](#5.sentence-1)
Given subexpressions E and F,
the expression compare_weak_order_fallback(E, F) is expression-equivalent ([[defns.expression.equivalent]](defns.expression.equivalent "3.22expression-equivalent")) to:
- [(5.1)](#5.1)
If the decayed types of E and F differ, compare_weak_order_fallback(E, F) is ill-formed[.](#5.1.sentence-1)
- [(5.2)](#5.2)
Otherwise, weak_order(E, F) if it is a well-formed expression[.](#5.2.sentence-1)
- [(5.3)](#5.3)
Otherwise, if the expressions E == F and E < F are both well-formed and
each of decltype(E == F) and decltype(E < F) models [*boolean-testable*](concept.booleantestable#concept:boolean-testable "18.5.2Boolean testability[concept.booleantestable]"),E == F ? weak_ordering::equivalent : E < F ? weak_ordering::less : weak_ordering::greater except that E and F are evaluated only once[.](#5.3.sentence-1)
- [(5.4)](#5.4)
Otherwise, compare_weak_order_fallback(E, F) is ill-formed[.](#5.4.sentence-1)
[*Note [5](#note-5)*:
Ill-formed cases above result in substitution failure
when compare_weak_order_fallback(E, F) appears in the immediate context
of a template instantiation[.](#5.sentence-3)
— *end note*]
[6](#6)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/support.tex#L5670)
The name compare_partial_order_fallback denotes
a customization point object ([[customization.point.object]](customization.point.object "16.3.3.3.5Customization Point Object types"))[.](#6.sentence-1)
Given subexpressions E and F,
the expression compare_partial_order_fallback(E, F) is expression-equivalent ([[defns.expression.equivalent]](defns.expression.equivalent "3.22expression-equivalent")) to:
- [(6.1)](#6.1)
If the decayed types of E and F differ, compare_partial_order_fallback(E, F) is ill-formed[.](#6.1.sentence-1)
- [(6.2)](#6.2)
Otherwise, partial_order(E, F) if it is a well-formed expression[.](#6.2.sentence-1)
- [(6.3)](#6.3)
Otherwise, if the expressions E == F, E < F, and F < E are all well-formed and
each of decltype(E == F), decltype(E < F), and decltype(F < E) models [*boolean-testable*](concept.booleantestable#concept:boolean-testable "18.5.2Boolean testability[concept.booleantestable]"),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.3.sentence-1)
- [(6.4)](#6.4)
Otherwise, compare_partial_order_fallback(E, F) is ill-formed[.](#6.4.sentence-1)
[*Note [6](#note-6)*:
Ill-formed cases above result in substitution failure
when compare_partial_order_fallback(E, F) appears in the immediate context
of a template instantiation[.](#6.sentence-3)
— *end note*]