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 && y
がtrue
である場合*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
処理系
- Clang:
- GCC: 10 ✅
- Visual C++: ??
参照
- P1614R2 The Mothership has Landed
- C++20での三方比較演算子の追加と、関連する演算子の自動導出