Namespaces
Variants

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

From cppreference.net
Utilities library
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. En caso contrario,
  • lhs se considera igual a rhs si, y solo si, tanto lhs como rhs no contienen un valor.
  • lhs se considera menor que rhs si, y solo si, rhs contiene un valor y lhs no lo contiene.
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 sobrecarga 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) cuando se compara con un optional que no contiene un valor.

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

(since 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 la posición 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 sobrecarga solo si se cumplen todas las siguientes condiciones:

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

Contenidos

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