最終更新日時(UTC):
が更新

履歴 編集

function
<iterator>

std::basic_const_iterator::operator<=>(C++23)

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>IteratorIteratorと比較可能なオブジェクト)の三方比較を行う。

  • (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';
}

出力

true
false
true
false

バージョン

言語

  • C++23

処理系

参照