Namespaces
Variants

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

От ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы проверки возможностей библиотеки (C++20)
Утилиты программ
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
 
 
Определен в заголовке <optional>
Сравнивает два optional объекта
template< class T, class U >
constexpr bool operator==( const optional<T>& lhs, const optional<U>& rhs );
(1) (начиная с C++17)
template< class T, class U >
constexpr bool operator!=( const optional<T>& lhs, const optional<U>& rhs );
(2) (начиная с C++17)
template< class T, class U >
constexpr bool operator<( const optional<T>& lhs, const optional<U>& rhs );
(3) (начиная с C++17)
template< class T, class U >
constexpr bool operator<=( const optional<T>& lhs, const optional<U>& rhs );
(4) (начиная с C++17)
template< class T, class U >
constexpr bool operator>( const optional<T>& lhs, const optional<U>& rhs );
(5) (начиная с C++17)
template< class T, class U >
constexpr bool operator>=( const optional<T>& lhs, const optional<U>& rhs );
(6) (начиная с 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) (начиная с C++20)
Сравнивает optional объект с nullopt
template< class T >
constexpr bool operator==( const optional<T>& opt, std::nullopt_t ) noexcept;
(8) (начиная с C++17)
template< class T >
constexpr bool operator==( std::nullopt_t, const optional<T>& opt ) noexcept;
(9) (начиная с C++17)
(до C++20)
template< class T >
constexpr bool operator!=( const optional<T>& opt, std::nullopt_t ) noexcept;
(10) (начиная с C++17)
(до C++20)
template< class T >
constexpr bool operator!=( std::nullopt_t, const optional<T>& opt ) noexcept;
(11) (начиная с C++17)
(до C++20)
template< class T >
constexpr bool operator<( const optional<T>& opt, std::nullopt_t ) noexcept;
(12) (начиная с C++17)
(до C++20)
template< class T >
constexpr bool operator<( std::nullopt_t, const optional<T>& opt ) noexcept;
(13) (начиная с C++17)
(до C++20)
template< class T >
constexpr bool operator<=( const optional<T>& opt, std::nullopt_t ) noexcept;
(14) (начиная с C++17)
(до C++20)
template< class T >
constexpr bool operator<=( std::nullopt_t, const optional<T>& opt ) noexcept;
(15) (начиная с C++17)
(до C++20)
template< class T >
constexpr bool operator>( const optional<T>& opt, std::nullopt_t ) noexcept;
(16) (начиная с C++17)
(до C++20)
template< class T >
constexpr bool operator>( std::nullopt_t, const optional<T>& opt ) noexcept;
(17) (начиная с C++17)
(до C++20)
template< class T > 
constexpr bool operator>=( const optional<T>& opt, std::nullopt_t ) noexcept;
(18) (начиная с C++17)
(до C++20)
template< class T > 
constexpr bool operator>=( std::nullopt_t, const optional<T>& opt ) noexcept;
(19) (начиная с C++17)
(до C++20)
template< class T >
constexpr std::strong_ordering
    operator<=>( const optional<T>& opt, std::nullopt_t ) noexcept;
(20) (начиная с C++20)
Сравнивает optional объект со значением
template< class T, class U >
constexpr bool operator==( const optional<T>& opt, const U& value );
(21) (начиная с C++17)
template< class U, class T >
constexpr bool operator==( const U& value, const optional<T>& opt );
(22) (начиная с C++17)
template< class T, class U >
constexpr bool operator!=( const optional<T>& opt, const U& value );
(23) (начиная с C++17)
template< class U, class T >
constexpr bool operator!=( const U& value, const optional<T>& opt );
(24) (начиная с C++17)
template< class T, class U >
constexpr bool operator<( const optional<T>& opt, const U& value );
(25) (начиная с C++17)
template< class U, class T >
constexpr bool operator<( const U& value, const optional<T>& opt );
(26) (начиная с C++17)
template< class T, class U >
constexpr bool operator<=( const optional<T>& opt, const U& value );
(27) (начиная с C++17)
template< class U, class T >
constexpr bool operator<=( const U& value, const optional<T>& opt );
(28) (начиная с C++17)
template< class T, class U >
constexpr bool operator>( const optional<T>& opt, const U& value );
(29) (начиная с C++17)
template< class U, class T >
constexpr bool operator>( const U& value, const optional<T>& opt );
(30) (начиная с C++17)
template< class T, class U >
constexpr bool operator>=( const optional<T>& opt, const U& value );
(31) (начиная с C++17)
template< class U, class T >
constexpr bool operator>=( const U& value, const optional<T>& opt );
(32) (начиная с 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) (начиная с C++20)

Выполняет операции сравнения для объектов optional.

1-7) Сравнивает два объекта optional, lhs и rhs. Содержащиеся значения сравниваются (с помощью соответствующего оператора T) только если и lhs, и rhs содержат значения. В противном случае,
  • lhs считается равным rhs тогда и только тогда, когда и lhs, и rhs не содержат значения.
  • lhs считается меньшим rhs тогда и только тогда, когда rhs содержит значение, а lhs — нет.
1-6) Пусть @ обозначает соответствующий оператор сравнения для каждой из этих функций:

Если соответствующее выражение *lhs @ *rhs некорректно или его результат не преобразуется в bool, программа считается некорректной.

(до C++26)

Эта перегрузка участвует в разрешении перегрузки только если соответствующее выражение *lhs @ *rhs корректно и его результат преобразуется в bool.

(начиная с C++26)
8-20) Сравнивает opt с nullopt. Эквивалентно (1-6) при сравнении с optional, которое не содержит значения.

Операторы <, <=, >, >= и != являются синтезированными на основе operator<=> и operator== соответственно.

(начиная с C++20)
21-33) Сравнивает opt с value. Значения сравниваются (с помощью соответствующего оператора T) только если opt содержит значение. В противном случае, opt считается меньшим value.
21-32) Пусть @ обозначает соответствующий оператор сравнения для каждой из этих функций:

Если соответствующее выражение *opt @ value или value @ *opt (в зависимости от положения операндов) некорректно или его результат не преобразуется в bool, программа считается некорректной.

(до C++26)

Эта перегрузка участвует в разрешении перегрузки только если все следующие условия удовлетворены:

  • U не является специализацией std::optional.
  • Соответствующее выражение *opt @ value или value @ *opt (в зависимости от положения операндов) корректно и его результат преобразуется в bool.
(начиная с C++26)

Параметры

lhs, rhs, opt - объект optional для сравнения
value - значение для сравнения с содержащимся значением

Возвращаемое значение

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

Исключения

1-7) Может выбрасывать исключения, определяемые реализацией.
21-33) Выбрасывает исключение, когда и что выбрасывает сравнение.

Примечания

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_constrained_equality 202403L (C++26) ограниченные операторы сравнения для std::optional

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 2945 C++17 порядок параметров шаблона непоследователен для случаев сравнения-с-T приведён к последовательности