- iterator[meta header]
- std[meta namespace]
- basic_const_iterator[meta class]
- function[meta id-type]
- cpp23[meta cpp]
template<sized_sentinel_for<Iterator> S>
constexpr difference_type operator-(const S& y) const; // (1)
template<not-a-const-iterator S>
requires sized_sentinel_for<S, Iterator>
friend constexpr difference_type operator-(const S& x, const basic_const_iterator& y); // (2) 非メンバ関数
- sized_sentinel_for[link /reference/iterator/sized_sentinel_for.md]
basic_const_iterator
の間、もしくはIterator
に対応する番兵との間の距離を計算する。
basic_const_iterator<Iterator>
のオブジェクトをi
、Iterator
に対応する番兵型のオブジェクトをs
とすると
- (1) :
i - s
のためのオーバーロード - (2) :
s - i
のためのオーバーロード
not-a-const-iterator<I>
はI
がbasic_const_iterator
の特殊化ではない場合にtrue
となる説明専用のコンセプトである。
ラップしているイテレータをcurrent_
メンバ変数に保持するとして
-
(1) : 以下と等価
return current_ - y;
-
(2) : 以下と等価
return x - y.current_;
(2)の関数はHidden friendsとして定義される。
#include <iostream>
#include <iterator>
#include <vector>
int main() {
std::vector vec = {1, 2, 3, 4, 5};
std::basic_const_iterator cit = vec.begin();
auto se = vec.end();
// 元のイテレータの番兵との間で距離計算
std::cout << (cit - se) << '\n';
std::cout << (se - cit) << '\n';
std::basic_const_iterator cse = se;
// basic_const_iterator同士で距離計算
// (1) -> (2)と呼ばれることで内部イテレータ同士の距離計算を行う
std::cout << (cit - cse) << '\n';
std::cout << (cse - cit) << '\n';
}
-5
5
-5
5
- C++23
- Clang: ??
- GCC: 13.1 [mark verified]
- Visual C++: 2022 Update 6 [mark verified]