};
template <typename T, typename U>
-constexpr bool operator==(const optional<T> &l, const optional<T> &r) noexcept(noexcept(*l == *r))
+constexpr bool operator==(const optional<T> &l, const optional<U> &r) noexcept(noexcept(*l == *r))
{
if(!l.has_value() || !r.has_value())
return !r.has_value();
}
template <typename T, typename U>
-constexpr bool operator!=(const optional<T> &l, const optional<T> &r) noexcept(noexcept(*l == *r))
+constexpr bool operator!=(const optional<T> &l, const optional<U> &r) noexcept(noexcept(*l == *r))
{
if(!l.has_value() || !r.has_value())
return r.has_value();
}
template <typename T, typename U>
-constexpr bool operator<(const optional<T> &l, const optional<T> &r) noexcept(noexcept(*l == *r))
+constexpr bool operator<(const optional<T> &l, const optional<U> &r) noexcept(noexcept(*l == *r))
{
if(!l.has_value() || !r.has_value())
return r.has_value();
}
template <typename T, typename U>
-constexpr bool operator>(const optional<T> &l, const optional<T> &r) noexcept(noexcept(*l == *r))
+constexpr bool operator>(const optional<T> &l, const optional<U> &r) noexcept(noexcept(*l == *r))
{
if(!l.has_value() || !r.has_value())
return l.has_value();
}
template <typename T, typename U>
-constexpr bool operator<=(const optional<T> &l, const optional<T> &r) noexcept(noexcept(*l == *r))
+constexpr bool operator<=(const optional<T> &l, const optional<U> &r) noexcept(noexcept(*l == *r))
{
if(!l.has_value() || !r.has_value())
return !l.has_value();
}
template <typename T, typename U>
-constexpr bool operator>=(const optional<T> &l, const optional<T> &r) noexcept(noexcept(*l == *r))
+constexpr bool operator>=(const optional<T> &l, const optional<U> &r) noexcept(noexcept(*l == *r))
{
if(!l.has_value() || !r.has_value())
return !r.has_value();