- iterator[meta header]
- std[meta namespace]
- basic_const_iterator[meta class]
- function[meta id-type]
- cpp23[meta cpp]
constexpr auto operator<=>(const basic_const_iterator& y) const
requires random_access_iterator<Iterator> && three_way_comparable<Iterator>; // (1)
template<different-from<basic_const_iterator> I>
constexpr auto operator<=>(const I& y) const
requires random_access_iterator<Iterator> && totally_ordered_with<Iterator, I> &&
three_way_comparable_with<Iterator, I>; // (2)
- different-from[link /reference/ranges/different-from.md]
- random_access_iterator[link /reference/iterator/random_access_iterator.md]
- three_way_comparable[link /reference/compare/three_way_comparable.md]
- totally_ordered_with[link /reference/concepts/totally_ordered.md]
basic_const_iterator<Iterator>
オブジェクトと別のイテレータ(basic_const_iterator<Iterator>
かIterator
、Iterator
と比較可能なオブジェクト)の三方比較を行う。
- (1) :
basic_const_iterator
同士の比較を行う - (2) : ラップしているイテレータ(
Iterator
)と直接比較可能な型との間で比較を行う
ラップするイテレータをcurrent_
というメンバに保持するとして
-
(1) : 以下と等価
return current_ <=> y.current_;
-
(2) : 以下と等価
return current_ <=> y;
(2)の演算子により以下の演算子が使用可能になる(制約は同じものが適用される)。
// 逆順
template<different-from<basic_const_iterator> I>
friend constexpr auto operator<=>(const I&, const basic_const_iterator&);
#include <iostream>
#include <iterator>
#include <vector>
#include <compare>
int main() {
std::vector vec = {1, 2, 3, 4, 5};
std::basic_const_iterator cit = vec.begin();
auto se = vec.end();
std::basic_const_iterator cse = se;
std::cout << std::boolalpha;
// (1) basic_const_iterator同士の比較
std::cout << std::is_lt(cit <=> cse) << '\n';
std::cout << std::is_lt(cse <=> cit) << '\n';
// (2) 元のイテレータとの比較
std::cout << std::is_lt(cit <=> se) << '\n';
std::cout << std::is_lt(se <=> cit) << '\n';
}
- <=>[color ff0000]
- is_lt[link /reference/compare/named_comparison_functions.md]
true
false
true
false
- C++23
- Clang: ??
- GCC: 13.1 [mark verified]
- Visual C++: 2022 Update 6 [mark verified]