std:: compare_weak_order_fallback
|
Défini dans l'en-tête
<compare>
|
||
|
inline
namespace
/* unspecified */
{
inline
constexpr
/* unspecified */
|
(depuis C++20) | |
|
Signature d'appel
|
||
|
template
<
class
T,
class
U
>
requires
/* see below */
|
(depuis C++20) | |
Effectue une comparaison à trois voies sur les
sous-expressions
t
et
u
et produit un résultat de type
std::weak_ordering
, même si l'opérateur
<=>
n'est pas disponible.
Si std:: decay_t < T > et std:: decay_t < U > sont le même type, std :: compare_weak_order_fallback ( t, u ) est équivalent en expression à :
- std:: weak_order ( t, u ) , si c'est une expression bien formée ; sinon,
-
t
==
u
?
std
::
weak_ordering
::
equivalent
:
t < u ? std :: weak_ordering :: less :
std :: weak_ordering :: greater , si les expressions t == u et t < u sont toutes deux bien formées et que chacun de decltype ( t == u ) et decltype ( t < u ) modélise boolean-testable , sauf que t et u ne sont évalués qu'une seule fois.
Dans tous les autres cas, std :: compare_weak_order_fallback ( t, u ) est mal formé, ce qui peut entraîner une substitution failure lorsqu'il apparaît dans le contexte immédiat d'une instanciation de template.
Table des matières |
Objets de point de personnalisation
Le nom
std::compare_weak_order_fallback
désigne un
objet de point de personnalisation
, qui est un
objet fonction
constant d'un type de classe
littéral
semiregular
. Voir
CustomizationPointObject
pour plus de détails.
Exemple
#include <compare> #include <iostream> // ne prend pas en charge <=> struct Rational_1 { int num; int den; // > 0 }; inline constexpr bool operator<(Rational_1 lhs, Rational_1 rhs) { return lhs.num * rhs.den < rhs.num * lhs.den; } inline constexpr bool operator==(Rational_1 lhs, Rational_1 rhs) { return lhs.num * rhs.den == rhs.num * lhs.den; } // prend en charge <=> struct Rational_2 { int num; int den; // > 0 }; inline constexpr std::weak_ordering operator<=>(Rational_2 lhs, Rational_2 rhs) { return lhs.num * rhs.den <=> rhs.num * lhs.den; } inline constexpr bool operator==(Rational_2 lhs, Rational_2 rhs) { return lhs <=> rhs == 0; } void print(int id, std::weak_ordering value) { std::cout << id << ") "; if (value == 0) std::cout << "equal\n"; else if (value < 0) std::cout << "less\n"; else std::cout << "greater\n"; } int main() { Rational_1 a{1, 2}, b{3, 4}; // print(0, a <=> b); // ne fonctionne pas print(1, std::compare_weak_order_fallback(a, b)); // fonctionne, utilise par défaut < et == Rational_2 c{6, 5}, d{8, 7}; print(2, c <=> d); // fonctionne print(3, std::compare_weak_order_fallback(c, d)); // fonctionne Rational_2 e{2, 3}, f{4, 6}; print(4, e <=> f); // fonctionne print(5, std::compare_weak_order_fallback(e, f)); // fonctionne }
Sortie :
1) less 2) greater 3) greater 4) equal 5) equal
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | S'applique à | Comportement publié | Comportement corrigé |
|---|---|---|---|
|
LWG 2114
( P2167R3 ) |
C++20 |
le mécanisme de repli exigeait seulement
que les types de retour soient convertibles en bool |
contraintes renforcées |
Voir aussi
|
(C++20)
|
effectue une comparaison à trois voies et produit un résultat de type
std::weak_ordering
(objet point de personnalisation) |