Namespaces
Variants

std::compare_weak_order_fallback

De es.cppreference.net
 
 
Biblioteca de utilidades
Soporte del lenguaje
Soporte de tipos (tipos básicos, RTTI)
Macros de prueba de características de la biblioteca (C++20)
Utilidades de programa
Funciones variádicas
Soporte de corrutinas (C++20)
Soporte de contratos (C++26)
Comparación de tres vías
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Utilidades generales
Operadores relacionales (obsoleto en C++20)
 
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 del mismo tipo, std::compare_weak_order_fallback(t, u) es equivalente a una expresión a:

  • std::weak_order(t, u), si es una expresión bien formada; en caso 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 son ambas bien formadas y cada una de decltype(t == u) y decltype(t < u) modela comprobable-booleano, 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.

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)