operator==, !=, <, <=, >, >=, <=>(std::optional)
| Defined in header <optional>
|
||
| Compare two optional objects |
||
template< class T, class U > constexpr bool operator==( const optional<T>& lhs, const optional<U>& rhs ); |
(1) | (since C++17) |
template< class T, class U > constexpr bool operator!=( const optional<T>& lhs, const optional<U>& rhs ); |
(2) | (since C++17) |
template< class T, class U > constexpr bool operator<( const optional<T>& lhs, const optional<U>& rhs ); |
(3) | (since C++17) |
template< class T, class U > constexpr bool operator<=( const optional<T>& lhs, const optional<U>& rhs ); |
(4) | (since C++17) |
template< class T, class U > constexpr bool operator>( const optional<T>& lhs, const optional<U>& rhs ); |
(5) | (since C++17) |
template< class T, class U > constexpr bool operator>=( const optional<T>& lhs, const optional<U>& rhs ); |
(6) | (since 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) | (since C++20) |
| Compare an optional object with a nullopt |
||
template< class T > constexpr bool operator==( const optional<T>& opt, std::nullopt_t ) noexcept; |
(8) | (since C++17) |
template< class T > constexpr bool operator==( std::nullopt_t, const optional<T>& opt ) noexcept; |
(9) | (since C++17) (until C++20) |
template< class T > constexpr bool operator!=( const optional<T>& opt, std::nullopt_t ) noexcept; |
(10) | (since C++17) (until C++20) |
template< class T > constexpr bool operator!=( std::nullopt_t, const optional<T>& opt ) noexcept; |
(11) | (since C++17) (until C++20) |
template< class T > constexpr bool operator<( const optional<T>& opt, std::nullopt_t ) noexcept; |
(12) | (since C++17) (until C++20) |
template< class T > constexpr bool operator<( std::nullopt_t, const optional<T>& opt ) noexcept; |
(13) | (since C++17) (until C++20) |
template< class T > constexpr bool operator<=( const optional<T>& opt, std::nullopt_t ) noexcept; |
(14) | (since C++17) (until C++20) |
template< class T > constexpr bool operator<=( std::nullopt_t, const optional<T>& opt ) noexcept; |
(15) | (since C++17) (until C++20) |
template< class T > constexpr bool operator>( const optional<T>& opt, std::nullopt_t ) noexcept; |
(16) | (since C++17) (until C++20) |
template< class T > constexpr bool operator>( std::nullopt_t, const optional<T>& opt ) noexcept; |
(17) | (since C++17) (until C++20) |
template< class T > constexpr bool operator>=( const optional<T>& opt, std::nullopt_t ) noexcept; |
(18) | (since C++17) (until C++20) |
template< class T > constexpr bool operator>=( std::nullopt_t, const optional<T>& opt ) noexcept; |
(19) | (since C++17) (until C++20) |
template< class T > constexpr std::strong_ordering operator<=>( const optional<T>& opt, std::nullopt_t ) noexcept; |
(20) | (since C++20) |
| Compare an optional object with a value |
||
template< class T, class U > constexpr bool operator==( const optional<T>& opt, const U& value ); |
(21) | (since C++17) |
template< class U, class T > constexpr bool operator==( const U& value, const optional<T>& opt ); |
(22) | (since C++17) |
template< class T, class U > constexpr bool operator!=( const optional<T>& opt, const U& value ); |
(23) | (since C++17) |
template< class U, class T > constexpr bool operator!=( const U& value, const optional<T>& opt ); |
(24) | (since C++17) |
template< class T, class U > constexpr bool operator<( const optional<T>& opt, const U& value ); |
(25) | (since C++17) |
template< class U, class T > constexpr bool operator<( const U& value, const optional<T>& opt ); |
(26) | (since C++17) |
template< class T, class U > constexpr bool operator<=( const optional<T>& opt, const U& value ); |
(27) | (since C++17) |
template< class U, class T > constexpr bool operator<=( const U& value, const optional<T>& opt ); |
(28) | (since C++17) |
template< class T, class U > constexpr bool operator>( const optional<T>& opt, const U& value ); |
(29) | (since C++17) |
template< class U, class T > constexpr bool operator>( const U& value, const optional<T>& opt ); |
(30) | (since C++17) |
template< class T, class U > constexpr bool operator>=( const optional<T>& opt, const U& value ); |
(31) | (since C++17) |
template< class U, class T > constexpr bool operator>=( const U& value, const optional<T>& opt ); |
(32) | (since 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) | (since C++20) |
Performs comparison operations on optional objects.
optional objects, lhs and rhs. The contained values are compared (using the corresponding operator of T) only if both lhs and rhs contain values. Otherwise,
lhsis considered equal torhsif, and only if, bothlhsandrhsdo not contain a value.lhsis considered less thanrhsif, and only if,rhscontains a value andlhsdoes not.
@ denote the corresponding comparison operator, for each of these functions:
|
If the corresponding expression |
(until C++26) |
|
This overload participates in overload resolution only if the corresponding expression |
(since C++26) |
opt with a nullopt. Equivalent to (1-6) when comparing to an optional that does not contain a value.
|
The |
(since C++20) |
opt with a value. The values are compared (using the corresponding operator of T) only if opt contains a value. Otherwise, opt is considered less than value.@ denote the corresponding comparison operator, for each of these functions:
|
If the corresponding expression |
(until C++26) |
|
This overload participates in overload resolution only if all following conditions are satisfied:
|
(since C++26) |
Parameters
| lhs, rhs, opt | - | an optional object to compare
|
| value | - | value to compare to the contained value |
Return value
lhs.has_value() != rhs.has_value() ? false :(lhs.has_value() == false ? true : *lhs == *rhs)
lhs.has_value() != rhs.has_value() ? true :(lhs.has_value() == false ? false : *lhs != *rhs)
!rhs ? false : (!lhs ? true : *lhs < *rhs)!lhs ? true : (!rhs ? false : *lhs <= *rhs)!lhs ? false : (!rhs ? true : *lhs > *rhs)!rhs ? true : (!lhs ? false : *lhs >= *rhs)lhs && rhs ? *lhs <=> *rhs : lhs.has_value() <=> rhs.has_value()!optopt.has_value()falseopt.has_value()!opttrueopt.has_value()falsetrue!optopt.has_value() <=> falseopt.has_value() ? *opt == value : falseopt.has_value() ? value == *opt : falseopt.has_value() ? *opt != value : trueopt.has_value() ? value != *opt : trueopt.has_value() ? *opt < value : trueopt.has_value() ? value < *opt : falseopt.has_value() ? *opt <= value : trueopt.has_value() ? value <= *opt : falseopt.has_value() ? *opt > value : falseopt.has_value() ? value > *opt : trueopt.has_value() ? *opt >= value : falseopt.has_value() ? value >= *opt : trueopt.has_value() ? *opt <=> value : std::strong_ordering::lessExceptions
Notes
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_constrained_equality |
202403L |
(C++26) | constrained comparison operators for std::optional |
Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 2945 | C++17 | order of template parameters inconsistent for compare-with-T cases | made consistent |