Namespaces
Variants

operator==, !=, <, <=, >, >=, <=>(std::optional)

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 a 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 <optional>
Comparar dos objetos optional
template< class T, class U >
constexpr bool operator==( const optional<T>& lhs, const optional<U>& rhs );
(1) (desde C++17)
template< class T, class U >
constexpr bool operator!=( const optional<T>& lhs, const optional<U>& rhs );
(2) (desde C++17)
template< class T, class U >
constexpr bool operator<( const optional<T>& lhs, const optional<U>& rhs );
(3) (desde C++17)
template< class T, class U >
constexpr bool operator<=( const optional<T>& lhs, const optional<U>& rhs );
(4) (desde C++17)
template< class T, class U >
constexpr bool operator>( const optional<T>& lhs, const optional<U>& rhs );
(5) (desde C++17)
template< class T, class U >
constexpr bool operator>=( const optional<T>& lhs, const optional<U>& rhs );
(6) (desde C++17)
template< class T, std::three_way_comparable_with<T> U >
constexpr std::compare_three_way_result_t<T, U>
    operator<=>( const optional<T>& lhs, const optional<U>& rhs );
(7) (desde C++20)
Comparar un objeto optional con un nullopt
template< class T >
constexpr bool operator==( const optional<T>& opt, std::nullopt_t ) noexcept;
(8) (desde C++17)
template< class T >
constexpr bool operator==( std::nullopt_t, const optional<T>& opt ) noexcept;
(9) (desde C++17)
(hasta C++20)
template< class T >
constexpr bool operator!=( const optional<T>& opt, std::nullopt_t ) noexcept;
(10) (desde C++17)
(hasta C++20)
template< class T >
constexpr bool operator!=( std::nullopt_t, const optional<T>& opt ) noexcept;
(11) (desde C++17)
(hasta C++20)
template< class T >
constexpr bool operator<( const optional<T>& opt, std::nullopt_t ) noexcept;
(12) (desde C++17)
(hasta C++20)
template< class T >
constexpr bool operator<( std::nullopt_t, const optional<T>& opt ) noexcept;
(13) (desde C++17)
(hasta C++20)
template< class T >
constexpr bool operator<=( const optional<T>& opt, std::nullopt_t ) noexcept;
(14) (desde C++17)
(hasta C++20)
template< class T >
constexpr bool operator<=( std::nullopt_t, const optional<T>& opt ) noexcept;
(15) (desde C++17)
(hasta C++20)
template< class T >
constexpr bool operator>( const optional<T>& opt, std::nullopt_t ) noexcept;
(16) (desde C++17)
(hasta C++20)
template< class T >
constexpr bool operator>( std::nullopt_t, const optional<T>& opt ) noexcept;
(17) (desde C++17)
(hasta C++20)
template< class T > 
constexpr bool operator>=( const optional<T>& opt, std::nullopt_t ) noexcept;
(18) (desde C++17)
(hasta C++20)
template< class T > 
constexpr bool operator>=( std::nullopt_t, const optional<T>& opt ) noexcept;
(19) (desde C++17)
(hasta C++20)
template< class T >
constexpr std::strong_ordering
    operator<=>( const optional<T>& opt, std::nullopt_t ) noexcept;
(20) (desde C++20)
Comparar un objeto optional con un valor
template< class T, class U >
constexpr bool operator==( const optional<T>& opt, const U& value );
(21) (desde C++17)
template< class U, class T >
constexpr bool operator==( const U& value, const optional<T>& opt );
(22) (desde C++17)
template< class T, class U >
constexpr bool operator!=( const optional<T>& opt, const U& value );
(23) (desde C++17)
template< class U, class T >
constexpr bool operator!=( const U& value, const optional<T>& opt );
(24) (desde C++17)
template< class T, class U >
constexpr bool operator<( const optional<T>& opt, const U& value );
(25) (desde C++17)
template< class U, class T >
constexpr bool operator<( const U& value, const optional<T>& opt );
(26) (desde C++17)
template< class T, class U >
constexpr bool operator<=( const optional<T>& opt, const U& value );
(27) (desde C++17)
template< class U, class T >
constexpr bool operator<=( const U& value, const optional<T>& opt );
(28) (desde C++17)
template< class T, class U >
constexpr bool operator>( const optional<T>& opt, const U& value );
(29) (desde C++17)
template< class U, class T >
constexpr bool operator>( const U& value, const optional<T>& opt );
(30) (desde C++17)
template< class T, class U >
constexpr bool operator>=( const optional<T>& opt, const U& value );
(31) (desde C++17)
template< class U, class T >
constexpr bool operator>=( const U& value, const optional<T>& opt );
(32) (desde C++17)
template< class T, std::three_way_comparable_with<T> U >
constexpr std::compare_three_way_result_t<T, U>
    operator<=>( const optional<T>& opt, const U& value );
(33) (desde C++20)

Realiza operaciones de comparación en objetos optional.

1-7) Compara dos objetos optional, lhs y rhs. Los valores contenidos se comparan (usando el operador correspondiente de T) solo si tanto lhs como rhs contienen valores. De lo contrario,
  • lhs se considera igual a rhs si, y solo si, ambos lhs y rhs no contienen un valor.
  • lhs se considera menor que rhs si, y solo si, rhs contiene un valor y lhs no.
1-6) Sea @ el operador de comparación correspondiente, para cada una de estas funciones:

Si la expresión correspondiente *lhs @ *rhs está mal formada o su resultado no es convertible a bool, el programa está mal formado.

(hasta C++26)

Esta sobrecarga participa en la resolución de sobrecargas solo si la expresión correspondiente *lhs @ *rhs está bien formada y su resultado es convertible a bool.

(desde C++26)
8-20) Compara opt con un nullopt. Equivalente a (1-6) al comparar con un optional que no contiene un valor.

Los operadores <, <=, >, >= y != son sintetizados a partir de operator<=> y operator== respectivamente.

(desde C++20)
21-33) Compara opt con un value. Los valores se comparan (usando el operador correspondiente de T) solo si opt contiene un valor. De lo contrario, opt se considera menor que value.
21-32) Sea @ el operador de comparación correspondiente, para cada una de estas funciones:

Si la expresión correspondiente *opt @ value o value @ *opt (dependiendo de las posiciones de los operandos) está mal formada o su resultado no es convertible a bool, el programa está mal formado.

(hasta C++26)

Esta sobrecarga participa en la resolución de sobrecargas solo si se cumplen todas las condiciones siguientes:

  • U no es una especialización de std::optional.
  • La expresión correspondiente *opt @ value o value @ *opt (dependiendo de las posiciones de los operandos) está bien formada y su resultado es convertible a bool.
(desde C++26)

Parámetros

lhs, rhs, opt - un objeto optional para comparar
value - valor para comparar con el valor contenido

Valor de retorno

1) lhs. has_value ( ) ! = rhs. has_value ( ) ? false :
( lhs. has_value ( ) == false ? true : * lhs == * rhs )
2) lhs. has_value ( ) ! = rhs. has_value ( ) ? true :
( lhs. has_value ( ) == false ? false : * lhs ! = * rhs )
3) ! rhs ? false : ( ! lhs ? true : * lhs < * rhs )
4) ! lhs ? true : ( ! rhs ? false : * lhs <= * rhs )
5) ! lhs ? false : ( ! rhs ? true : * lhs > * rhs )
6) ! rhs ? true : ( ! lhs ? false : * lhs >= * rhs )
7) lhs && rhs ? * lhs <=> * rhs : lhs. has_value ( ) <=> rhs. has_value ( )
8,9) ! opt
10,11) opt. has_value ( )
12) false
13) opt. has_value ( )
14) ! opt
15) true
16) opt. has_value ( )
17) false
18) true
19) ! opt
20) opt. has_value ( ) <=> false
21) opt. has_value ( ) ? * opt == value : false
22) opt. has_value ( ) ? value == * opt : false
23) opt. has_value ( ) ? * opt ! = value : true
24) opt. has_value ( ) ? value ! = * opt : true
25) opt. has_value ( ) ? * opt < value : true
26) opt. has_value ( ) ? value < * opt : false
27) opt. has_value ( ) ? * opt <= value : true
28) opt. has_value ( ) ? value <= * opt : false
29) opt. has_value ( ) ? * opt > value : false
30) opt. has_value ( ) ? value > * opt : true
31) opt. has_value ( ) ? * opt >= value : false
32) opt. has_value ( ) ? value >= * opt : true
33) opt. has_value ( ) ? * opt <=> value : std :: strong_ordering :: less

Excepciones

1-7) Puede lanzar excepciones definidas por la implementación.
21-33) Lanza cuando y lo que la comparación lanza.

Notas

Macro de prueba de características Valor Estándar Característica
__cpp_lib_constrained_equality 202403L (C++26) Operadores de comparación restringidos para std::optional

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 2945 C++17 el orden de los parámetros de plantilla es inconsistente para los casos de comparación-con-T hecho consistente