- functional[meta header]
- std[meta namespace]
- reference_wrapper[meta class]
- function template[meta id-type]
friend constexpr auto
operator<=>(reference_wrapper x,
reference_wrapper y); // (1) C++26
friend constexpr auto
operator<=>(reference_wrapper x,
const T& y); // (2) C++26
friend constexpr auto
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)はオペランドを左右で逆にしても使用できる。
- (1) :
synth-three-way(x.get(), y.get())が適格であること - (2) :
synth-three-way(x.get(), y)が適格であること - (3) :
is_const_v<T>がfalseであり、かつsynth-three-way(x.get(), y.get())が適格であること
-
(1) :
return synth-three-way(x.get(), y.get());- get()[link get.md]
-
(2) :
return synth-three-way(x.get(), y);- get()[link get.md]
-
(3) :
return synth-three-way(x.get(), y.get());- get()[link get.md]
- この演算子により、以下の演算子が使用可能になる:
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 [mark verified]
- GCC: 10 [mark verified]
- Visual C++: 2019 [mark verified]
- P2944R3 Comparisons for
reference_wrapper - LWG Issue 4071.
reference_wrappercomparisons are not SFINAE-friendly- C++26で、
operator<=>の戻り値型がsynth-three-way-result<T>からautoに変更され、synth-three-wayが適格であることが制約に加わり、SFINAEフレンドリに振る舞うようになった
- C++26で、