std::ranges::iota_view<W, Bound>::iterator
struct /*iterator*/; |
(1) | (説明用*) |
| ヘルパーエイリアステンプレート |
||
template< class I > using /*iota-diff-t*/ = /* see below */; |
(2) | (説明用*) |
| ヘルパーコンセプト |
||
template< class I > concept /*decrementable*/ = |
(3) | (説明用*) |
template< class I > concept /*advanceable*/ = |
(4) | (説明用*) |
iterator は、ranges::iota_view<W, Bound> の begin() および end() によって返されるイテレータの型です。Iが整数型でない場合、または整数型であり、かつ sizeof(std::iter_difference_t<I>) が sizeof(I) よりも大きい場合、/*iota-diff-t*/<I> は std::iter_difference_t<I> です。- それ以外の場合、/*iota-diff-t*/<I> は、そのような型が存在するならば、
Iの幅よりも大きい幅を持つ符号付き整数型です。 - それ以外の場合、
Iは最も幅の広い整数型の一つであり、/*iota-diff-t*/<I> は幅がIの幅以上である、未規定の 符号付き整数型のような型です。この場合、/*iota-diff-t*/<I> がweakly_incrementableをモデル化するかどうかは未規定です。
decrementable と totally_ordered の両方をモデル化し、かつその型とその差分型との間の operator+=、operator-=、operator+、operator- が共通の意味を持つことを指定します。/*iterator*/ は以下をモデル化します。
- W が
advanceable(4) をモデル化する場合、random_access_iterator。 - W が
decrementable(3) をモデル化する場合、bidirectional_iterator。 - W が
incrementableをモデル化する場合、forward_iterator。 - それ以外の場合、
input_iterator。
ただし、W が incrementable をモデル化する場合にのみ LegacyInputIterator を満たし、そうでない場合は LegacyInputIterator を満たしません。
[編集] 意味的要求
I は、I が decrementable を満たし、それが包含するすべてのコンセプトが満たされ、かつ等しいオブジェクト a と b (型 I) が与えられた場合にのみ decrementable をモデル化します。- もし a と b がプリインクリメントおよびポストインクリメント演算子
operator<<の両方のドメイン内にある(つまり、デクリメント可能である)場合、以下はすべて true です。- std::addressof(--a) == std::addressof(a),
- bool(a-- == b),
- bool(((void)a--, a) == --b),
- bool(++(--a) == b).
- もし a と b がプリインクリメントおよびポストインクリメント演算子
operator<<の両方のドメイン内にある(つまり、インクリメント可能である)場合、bool(--(++a) == b) は true です。
D を /*iota-diff-t*/<I> とします。型 I は、I が advanceable を満たし、それが包含するすべてのコンセプトが満たされ、かつ- オブジェクト a と b (型
I) および - 値 n (型
D)
ここで、b は a から n 回の value_ のインクリメント操作で到達可能である場合、以下のすべての条件が満たされます。
- (a += n) が b に等しい場合にのみモデル化されます。
- std::addressof(a += n) は std::addressof(a) と等しい。
- I(a + n) は (a += n) と等しい。
Dの任意の二つの正の値 x と y について、I(a + D(x + y)) がwell-definedであるならば、I(a + D(x + y)) は I(I(a + x) + y) と等しい。- I(a + D(0)) は a と等しい。
- もし I(a + D(1)) がwell-definedであるならば、I(a + n) は [](I c) { return ++c; }(I(a + D(n - 1))) と等しい。
- (b += -n) は a と等しい。
- (b -= n) は a と等しい。
- std::addressof(b -= n) は std::addressof(b) と等しい。
- I(b - n) は (b -= n) と等しい。
- D(b - a) は n と等しい。
- D(a - b) は D(-n) と等しい。
- bool(a <= b) は true。
[編集] ネストされた型
| 型 | 定義 |
iterator_concept
|
an イテレータタグ、以下を参照 |
iterator_category( W が incrementable をモデル化し、/*iota-diff-t*/<W> が整数型である場合のみ存在する) |
std::input_iterator_tag |
value_type
|
W
|
difference_type
|
/*iota-diff-t*/<W> |
[編集] イテレータコンセプトの決定
iterator_concept は以下のように定義されます。
- もし
Wがadvanceableをモデル化する場合、iterator_conceptは std::random_access_iterator_tag を指します。 - それ以外で、もし
Wがdecrementableをモデル化する場合、iterator_conceptは std::bidirectional_iterator_tag を指します。 - それ以外で、もし
Wがincrementableをモデル化する場合、iterator_conceptは std::forward_iterator_tag を指します。 - それ以外の場合、
iterator_conceptは std::input_iterator_tag を指します。
[編集] データメンバ
| メンバ | 定義 |
W value_ |
現在の値 (説明用のメンバオブジェクト*) |
[編集] メンバ関数
std::ranges::iota_view::iterator::iterator
| /*iterator*/() requires std::default_initializable<W> = default; |
(1) | (C++20以降) |
| constexpr explicit /*iterator*/( W value ); |
(2) | (C++20以降) |
value_ を値初期化します。std::ranges::iota_view::iterator::operator*
| constexpr W operator*() const noexcept(std::is_nothrow_copy_constructible_v<W>); |
(C++20以降) | |
value_ を返します。
例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6, 9).begin()}; const int& r = *it; // binds with temporary assert(*it == 6 and r == 6); ++it; assert(*it == 7 and r == 6); }
std::ranges::iota_view::iterator::operator++
| constexpr /*iterator*/& operator++(); |
(1) | (C++20以降) |
| constexpr void operator++(int); |
(2) | (C++20以降) |
| constexpr /*iterator*/ operator++(int) requires std::incrementable<W>; |
(3) | (C++20以降) |
value_ ; return *this; に相当します。value_ ; に相当します。value_ ; return tmp; に相当します。例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(8).begin()}; assert(*it == 8); assert(*++it == 9); assert(*it++ == 9); assert(*it == 10); }
std::ranges::iota_view::iterator::operator--
| constexpr /*iterator*/& operator--() requires /*decrementable*/<W>; |
(1) | (C++20以降) |
| constexpr /*iterator*/operator--(int) requires /*decrementable*/<W>; |
(2) | (C++20以降) |
value_ ; return *this; に相当します。value_ ; return tmp; に相当します。例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(8).begin()}; assert(*it == 8); assert(*--it == 7); assert(*it-- == 7); assert(*it == 6); }
std::ranges::iota_view::iterator::operator+=
| constexpr /*iterator*/& operator+=( difference_type n ) requires /*advanceable*/<W>; |
(C++20以降) | |
value_ を更新し、*this を返します。
- もし
Wが 符号なし整数型のような型の場合 - それ以外の場合、
value_+= n を実行します。
例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(5).begin()}; assert(*it == 5); assert(*(it += 3) == 8); }
std::ranges::iota_view::iterator::operator-=
| constexpr /*iterator*/& operator-=( difference_type n ) requires /*advanceable*/<W>; |
(C++20以降) | |
value_ を更新し、*this を返します。
- もし
Wが 符号なし整数型のような型の場合 - それ以外の場合、
value_-= n を実行します。
例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6).begin()}; assert(*it == 6); assert(*(it -= -3) == 9); }
std::ranges::iota_view::iterator::operator[]
| constexpr W operator[]( difference_type n ) const requires /*advanceable*/<W>; |
(C++20以降) | |
W(value_ + n) を返します。
例
#include <cassert> #include <ranges> int main() { auto it{std::views::iota(6).begin()}; assert(*it == 6); assert(*(it + 3) == 9); }
[編集] 非メンバ関数
operator==, <, >, <=, >=, <=>(std::ranges::iota_view::iterator)
| friend constexpr bool operator== ( const /*iterator*/& x, const /*iterator*/& y ) |
(1) | (C++20以降) |
| friend constexpr bool operator< ( const /*iterator*/& x, const /*iterator*/& y ) |
(2) | (C++20以降) |
| friend constexpr bool operator> ( const /*iterator*/& x, const /*iterator*/& y ) |
(3) | (C++20以降) |
| friend constexpr bool operator<= ( const /*iterator*/& x, const /*iterator*/& y ) |
(4) | (C++20以降) |
| friend constexpr bool operator>= ( const /*iterator*/& x, const /*iterator*/& y ) |
(5) | (C++20以降) |
| friend constexpr bool operator<=> ( const /*iterator*/& x, const /*iterator*/& y ) |
(6) | (C++20以降) |
!= 演算子は operator== から合成される。
これらの関数は、通常の 非修飾または 修飾ルックアップからは見えず、iterator が引数の関連クラスである場合にのみ 引数依存ルックアップによって見つけることができます。
operator+(std::ranges::iota_view::iterator)
| friend constexpr /*iterator*/ operator+ ( /*iterator*/ i, difference_type n ) |
(1) | (C++20以降) |
| friend constexpr /*iterator*/ operator+ ( difference_type n, /*iterator*/ i ) |
(2) | (C++20以降) |
i += n; return i; に相当します。
これらの関数は、通常の 非修飾または 修飾ルックアップからは見えず、iterator が引数の関連クラスである場合にのみ 引数依存ルックアップによって見つけることができます。
operator-(std::ranges::iota_view::iterator)
| friend constexpr /*iterator*/ operator- ( /*iterator*/ i, difference_type n ) |
(1) | (C++20以降) |
| friend constexpr difference_type operator- ( const /*iterator*/& x, const /*iterator*/& y ) |
(2) | (C++20以降) |
D を difference_type とします。これらの関数は、通常の 非修飾または 修飾ルックアップからは見えず、iterator が引数の関連クラスである場合にのみ 引数依存ルックアップによって見つけることができます。
[編集] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| P2259R1 | C++20 | メンバ iterator_category は常に定義されています。 |
W が incrementable を満たす場合のみ定義されます。 |
| LWG 3580 | C++20 | operator+ と operator- の本体は 暗黙の移動を排除していました。 |
暗黙の移動に適したものに変更されました。 |