最終更新日時(UTC):
が更新

履歴 編集

function template
<optional>

std::operator<=>(C++20)

namespace std {
  template <class T, three_way_comparable_with<T> U>
  constexpr compare_three_way_result_t<T,U>
    operator<=>(const optional<T>& x, const optional<U>& y); // (1) C++20

  template <class T>
  constexpr strong_ordering
    operator<=>(const optional<T>&, nullopt_t) noexcept;     // (2) C++20

  template <class T, three_way_comparable_with<T> U>
  constexpr compare_three_way_result_t<T,U>
    operator<=>(const optional<T>& x, const U& y);           // (3) C++20
}

概要

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

  • (1) : optional<T>optional<U>の三方比較
  • (2) : optional<T>と無効値nullopt_tの三方比較
  • (3) : optional<T>と有効値Uの三方比較

戻り値

  • (1) :

    • x && ytrueである場合*x <=> *yを返し、そうでなければbool(x) <=> bool(y)を返す
  • (2) :

    return bool(x) <=> false;
    

  • (3) : 以下と等価

    return bool(x) ? *x <=> v : strong_ordering::less;
    

備考

  • (2) : この演算子により、以下の演算子が使用可能になる (C++20):
    • bool operator<(const optional<T>&, const nullopt_t&) noexcept;
    • bool operator<(const nullopt_t&, const optional<T>&) noexcept;
    • bool operator<=(const optional<T>&, const nullopt_t&) noexcept;
    • bool operator<=(const nullopt_t&, const optional<T>&) noexcept;
    • bool operator>(const optional<T>&, const nullopt_t&) noexcept;
    • bool operator>(const nullopt_t&, const optional<T>&) noexcept;
    • bool operator>=(const optional<T>&, const nullopt_t&) noexcept;
    • bool operator>=(const nullopt_t&, const optional<T>&) noexcept;

#include <cassert>
#include <optional>

int main()
{
  // optionalオブジェクト同士の比較
  {
    std::optional<int> a = 3;
    std::optional<int> b = 1;
    std::optional<int> c = 3;
    std::optional<int> none;

    assert((a <=> c) == 0);
    assert((a <=> b) != 0);
    assert((a <=> none) != 0);
    assert((none <=> a) != 0);
  }

  // optionalオブジェクトとnulloptの比較
  {
    std::optional<int> p = 3;
    std::optional<int> none;

    assert((p <=> std::nullopt) != 0);
    assert((none <=> std::nullopt) == 0);

    assert((std::nullopt <=> p) != 0);
    assert((std::nullopt <=> none) == 0);
  }

  // optionalオブジェクトと有効値の比較
  {
    std::optional<int> p = 3;
    std::optional<int> none;

    assert((p <=> 3) == 0);
    assert((3 <=> p) == 0);

    assert((none <=> 3) != 0);
    assert((3 <=> none) != 0);
  }
}

出力

バージョン

言語

  • C++20

処理系

参照