std::compare_weak_order_fallback
| 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 expresionest == uyt < uson ambas bien formadas y cada una dedecltype(t == u)ydecltype(t < u)modela comprobable-booleano, excepto quetyuse 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) |