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)
概要
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';
}
24
#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';
出力
true
false
true
false
バージョン
言語
- C++23
処理系
- Clang: ??
- GCC: 13.1 ✅
- Visual C++: 2022 Update 6 ✅