Skip to content

Latest commit

 

History

History
80 lines (63 loc) · 2.01 KB

File metadata and controls

80 lines (63 loc) · 2.01 KB

operator<=>

  • variant[meta header]
  • std[meta namespace]
  • function template[meta id-type]
  • cpp20[meta cpp]
namespace std {
  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); // (1) C++20
}
  • common_comparison_category_t[link /reference/compare/common_comparison_category.md]

概要

variantオブジェクトの三方比較を行う。

テンプレートパラメータ制約

戻り値

以下と等価:

if (v.valueless_by_exception() && w.valueless_by_exception())
  return strong_ordering::equal;
if (v.valueless_by_exception())
  return strong_ordering::less;
if (w.valueless_by_exception())
  return strong_ordering::greater;
if (auto c = v.index() <=> w.index(); c != 0)
  return c;
return get<i>(v) <=> get<i>(w);
  • valueless_by_exception()[link valueless_by_exception.md]
  • index()[link index.md]
  • get[link get.md]

ここでiv.index()である。

#include <cassert>
#include <variant>

int main()
{
  std::variant<int, char, double> a = 1;
  std::variant<int, char, double> b = 3.14;
  std::variant<int, char, double> c = 3;

  assert((a <=> a) == 0); // 保持する型と値が同じ
  assert((b <=> b) == 0); // 保持する型と値が同じ
  assert((a <=> b) != 0); // 保持する型が異なる
  assert((a <=> c) != 0); // 保持する型が同じだが、値が異なる
}

出力

バージョン

言語

  • C++20

処理系

参照