friend constexpr synth-three-way-result<T>
operator<=>(reference_wrapper x,
reference_wrapper y); // (1) C++26
friend constexpr synth-three-way-result<T>
operator<=>(reference_wrapper x,
const T& y); // (2) C++26
friend constexpr synth-three-way-result<T>
operator<=>(reference_wrapper x,
reference_wrapper<const T> y); // (3) C++26
概要
三方比較を行う。
- (1) : 同じ要素型の
reference_wrapper
同士を三方比較する - (2) :
reference_wrapper
と要素型T
を三方比較する - (3) :
reference_wrapper<T>
とreference_wrapper<const T>
を三方比較する
(2)と(3)はオペランドを左右で逆にしても使用できる。
テンプレートパラメータ制約
- (3) :
is_const_v<T>
がfalse
であること
戻り値
-
(1) :
return synth-three-way(x.get(), y.get());
-
(2) :
return synth-three-way(x.get(), y);
-
(3) :
return synth-three-way(x.get(), y.get());
備考
- この演算子により、以下の演算子が使用可能になる:
operator<
operator<=
operator>
operator>=
例
#include <cassert>
#include <compare>
#include <functional>
int main()
{
int x = 3;
int y = 3;
int z = 4;
assert((std::ref(x) <=> std::ref(y)) == 0);
assert(std::ref(x) < std::ref(z));
assert(std::ref(x) <= std::ref(z));
assert(std::ref(z) > std::ref(x));
assert(std::ref(z) >= std::ref(x));
assert((std::ref(x) <=> 3) == 0);
assert((3 <=> std::ref(x)) == 0);
assert((std::ref(x) <=> std::cref(y)) == 0);
assert((std::cref(x) <=> std::ref(y)) == 0);
}
出力
バージョン
言語
- C++26
処理系
- Clang: 11.0 ✅
- GCC: 10 ✅
- Visual C++: 2019 ✅