Namespaces
Variants

std:: compare_weak_order_fallback

From cppreference.net
Utilities library
Definido en el encabezado <compare>
inline namespace /* unspecified */ {

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

}
(desde C++20)
Firma de llamada
template < class T, class U >

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

compare_weak_order_fallback ( T && t, U && u ) noexcept ( /* see below */ ) ;
(desde C++20)

Realiza una comparación de tres vías en subexpresiones t y u y produce un resultado de tipo std::weak_ordering , incluso si el operador <=> no está disponible.

Si std:: decay_t < T > y std:: decay_t < U > son el mismo tipo, std :: compare_weak_order_fallback ( t, u ) es equivalente-expresión a:

  • std:: weak_order ( t, u ) , si es una expresión bien formada; de lo contrario,
  • t == u ? std :: weak_ordering :: equivalent :
    t < u ? std :: weak_ordering :: less :
    std :: weak_ordering :: greater
    , si las expresiones t == u y t < u están ambas bien formadas y cada uno de decltype ( t == u ) y decltype ( t < u ) modela boolean-testable , excepto que t y u se evalúan solo una vez.

En todos los demás casos, std :: compare_weak_order_fallback ( t, u ) está mal formado, lo que puede resultar en fallo de sustitución cuando aparece en el contexto inmediato de una instanciación de plantilla.

Contenidos

Objetos de punto de personalización

El nombre std::compare_weak_order_fallback denota un objeto de punto de personalización , que es un objeto función constante de un tipo de clase literal semiregular . Consulte CustomizationPointObject para más detalles.

Ejemplo

#include <compare>
#include <iostream>
// no soporta <=>
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;
}
// soporta <=>
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); // no funciona
    print(1, std::compare_weak_order_fallback(a, b)); // funciona, recurre a < y ==
    Rational_2 c{6, 5}, d{8, 7};
    print(2, c <=> d); // funciona
    print(3, std::compare_weak_order_fallback(c, d)); // funciona
    Rational_2 e{2, 3}, f{4, 6};
    print(4, e <=> f); // funciona
    print(5, std::compare_weak_order_fallback(e, f)); // funciona
}

Salida:

1) less
2) greater
3) greater
4) equal
5) equal

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2114
( P2167R3 )
C++20 el mecanismo de respaldo solo requería
que los tipos de retorno fueran convertibles a bool
restricciones fortalecidas

Véase también

(C++20)
realiza una comparación de 3 vías y produce un resultado de tipo std::weak_ordering
(objeto de punto de personalización)