Namespaces
Variants

std:: compare_weak_order_fallback

From cppreference.net
Utilities library
Défini dans l'en-tête <compare>
inline namespace /* unspecified */ {

inline constexpr /* unspecified */
compare_weak_order_fallback = /* unspecified */ ;

}
(depuis C++20)
Signature d'appel
template < class T, class U >

requires /* see below */
constexpr std:: weak_ordering

compare_weak_order_fallback ( T && t, U && u ) noexcept ( /* 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)