template<class... Types>
  constexpr bool operator==(const variant<Types...>& v, const variant<Types...>& w);
template<class... Types>
  constexpr bool operator!=(const variant<Types...>& v, const variant<Types...>& w);
template<class... Types>
  constexpr bool operator<(const variant<Types...>& v, const variant<Types...>& w);
template<class... Types>
  constexpr bool operator>(const variant<Types...>& v, const variant<Types...>& w);
template<class... Types>
  constexpr bool operator<=(const variant<Types...>& v, const variant<Types...>& w);
template<class... Types>
  constexpr bool operator>=(const variant<Types...>& v, const variant<Types...>& w);
template<class... Types> requires (three_way_comparable<Types> && ...)
  constexpr common_comparison_category_t<compare_three_way_result_t<Types>...>
    operator<=>(const variant<Types...>& v, const variant<Types...>& w);