operator==, !=, <, <=, >, >=, <=>(std::optional)
Defined in header <optional> | ||
Compare two optional objects | ||
template<class T, class U > constexprbool operator==(const optional<T>& lhs, const optional<U>& rhs ); | (1) | (since C++17) |
template<class T, class U > constexprbool operator!=(const optional<T>& lhs, const optional<U>& rhs ); | (2) | (since C++17) |
template<class T, class U > constexprbool operator<(const optional<T>& lhs, const optional<U>& rhs ); | (3) | (since C++17) |
template<class T, class U > constexprbool operator<=(const optional<T>& lhs, const optional<U>& rhs ); | (4) | (since C++17) |
template<class T, class U > constexprbool operator>(const optional<T>& lhs, const optional<U>& rhs ); | (5) | (since C++17) |
template<class T, class U > constexprbool operator>=(const optional<T>& lhs, const optional<U>& rhs ); | (6) | (since C++17) |
template<class T, std::three_way_comparable_with<T> U > constexprstd::compare_three_way_result_t<T, U> | (7) | (since C++20) |
Compare an optional object with a nullopt | ||
template<class T > constexprbool operator==(const optional<T>& opt, std::nullopt_t)noexcept; | (8) | (since C++17) |
template<class T > constexprbool operator==(std::nullopt_t, const optional<T>& opt )noexcept; | (9) | (since C++17) (until C++20) |
template<class T > constexprbool operator!=(const optional<T>& opt, std::nullopt_t)noexcept; | (10) | (since C++17) (until C++20) |
template<class T > constexprbool operator!=(std::nullopt_t, const optional<T>& opt )noexcept; | (11) | (since C++17) (until C++20) |
template<class T > constexprbool operator<(const optional<T>& opt, std::nullopt_t)noexcept; | (12) | (since C++17) (until C++20) |
template<class T > constexprbool operator<(std::nullopt_t, const optional<T>& opt )noexcept; | (13) | (since C++17) (until C++20) |
template<class T > constexprbool operator<=(const optional<T>& opt, std::nullopt_t)noexcept; | (14) | (since C++17) (until C++20) |
template<class T > constexprbool operator<=(std::nullopt_t, const optional<T>& opt )noexcept; | (15) | (since C++17) (until C++20) |
template<class T > constexprbool operator>(const optional<T>& opt, std::nullopt_t)noexcept; | (16) | (since C++17) (until C++20) |
template<class T > constexprbool operator>(std::nullopt_t, const optional<T>& opt )noexcept; | (17) | (since C++17) (until C++20) |
template<class T > constexprbool operator>=(const optional<T>& opt, std::nullopt_t)noexcept; | (18) | (since C++17) (until C++20) |
template<class T > constexprbool operator>=(std::nullopt_t, const optional<T>& opt )noexcept; | (19) | (since C++17) (until C++20) |
template<class T > constexprstd::strong_ordering | (20) | (since C++20) |
Compare an optional object with a value | ||
template<class T, class U > constexprbool operator==(const optional<T>& opt, const U& value ); | (21) | (since C++17) |
template<class U, class T > constexprbool operator==(const U& value, const optional<T>& opt ); | (22) | (since C++17) |
template<class T, class U > constexprbool operator!=(const optional<T>& opt, const U& value ); | (23) | (since C++17) |
template<class U, class T > constexprbool operator!=(const U& value, const optional<T>& opt ); | (24) | (since C++17) |
template<class T, class U > constexprbool operator<(const optional<T>& opt, const U& value ); | (25) | (since C++17) |
template<class U, class T > constexprbool operator<(const U& value, const optional<T>& opt ); | (26) | (since C++17) |
template<class T, class U > constexprbool operator<=(const optional<T>& opt, const U& value ); | (27) | (since C++17) |
template<class U, class T > constexprbool operator<=(const U& value, const optional<T>& opt ); | (28) | (since C++17) |
template<class T, class U > constexprbool operator>(const optional<T>& opt, const U& value ); | (29) | (since C++17) |
template<class U, class T > constexprbool operator>(const U& value, const optional<T>& opt ); | (30) | (since C++17) |
template<class T, class U > constexprbool operator>=(const optional<T>& opt, const U& value ); | (31) | (since C++17) |
template<class U, class T > constexprbool operator>=(const U& value, const optional<T>& opt ); | (32) | (since C++17) |
template<class T, std::three_way_comparable_with<T> U > constexprstd::compare_three_way_result_t<T, U> | (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, - lhs is considered equal torhs if, and only if, both lhs and rhs do not contain a value.
- lhs is considered less thanrhs if, and only if, rhs contains a value and lhs does not.
If the corresponding expression *lhs @ *rhs is ill-formed or its result is not convertible to bool, the program is ill-formed. | (until C++26) |
This overload participates in overload resolution only if the corresponding expression *lhs @ *rhs is well-formed and its result is convertible to bool. | (since C++26) |
nullopt
. Equivalent to (1-6) when comparing to an optional
that does not contain a value. The | (since C++20) |
T
) only if opt contains a value. Otherwise, opt is considered less thanvalue.If the corresponding expression *opt @ value or value @ *opt (depending on the positions of the operands) is ill-formed or its result is not convertible to bool, the program is ill-formed. | (until C++26) |
This overload participates in overload resolution only if all following conditions are satisfied:
| (since C++26) |
Contents |
[edit]Parameters
lhs, rhs, opt | - | an optional object to compare |
value | - | value to compare to the contained value |
[edit]Return value
(lhs.has_value()==false?true:*lhs ==*rhs)
(lhs.has_value()==false?false:*lhs !=*rhs)
[edit]Exceptions
[edit]Notes
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_constrained_equality | 202403L | (C++26) | constrained comparison operators for std::optional |
[edit]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 |