std::ranges::iota_view<W, Bound>::iterator
struct /*iterator*/;
|
(1) | (*説明専用*)ヘルパーエイリアステンプレート (2) |
| (*説明専用*) |
||
template< class I >
using /*iota-diff-t*/ = /* see below */;
|
ヘルパーコンセプト | (3)(*説明専用*) (4) |
| (*説明専用*) |
||
template< class I >
concept /*decrementable*/ =
std::incrementable<I> && requires(I i)
{
{ --i } -> std::same_as<I&>;
{ i-- } -> std::same_as<I>;
};
|
(4) | (*説明専用*) (4)(*説明専用*) |
template< class I >
concept /*advanceable*/ =
/*decrementable*/<I> && std::totally_ordered<I> &&
requires(I i, const I j, const /*iota-diff-t*/<I> n)
{
{ i += n } -> std::same_as<I&>;
{ i -= n } -> std::same_as<I&>;
I(j + n);
I(n + j);
I(j - n);
{ j - j } -> std::convertible_to</*iota-diff-t*/<I>>;
};
|
(4) | (*説明専用*) (4)(*説明専用*) |
ranges::iota_view<W, Bound>::iterator は、begin() および end() が ranges::iota_view<W, Bound> に対して返すイテレータの型です。Iが整数型でない場合、または整数型でありかつsizeof(std::iter_difference_t<I>)がsizeof(I)より大きい場合、/*iota-diff-t*/<I>はstd::iter_difference_t<I>です。- そうでない場合、
/*iota-diff-t*/<I>は、そのような型が存在すれば、Iの幅より大きい幅を持つ符号付き整数型です。 - そうでない場合、
Iは最も広い整数型のうちの1つであり、/*iota-diff-t*/<I>は の幅以上の幅を持つ、未規定の 符号付き整数ライク型Iです。この場合、/*iota-diff-t*/<I>が weakly_incrementable をモデル化するかどうかは未規定です。
decrementable と totally_ordered の両方であり、かつその型およびその異なる型の間での operator+=、operator-=、operator+、および operator- が共通の意味を持つことを指定します。/*iterator*/は、以下をモデル化します。
- random_access_iterator:
Wがadvanceable(4) をモデル化する場合。 - bidirectional_iterator:
Wがdecrementable(3) をモデル化する場合。 - forward_iterator:
Wが incrementable をモデル化する場合。および - input_iterator: それ以外の場合。
ただし、LegacyInputIterator を満たすのは W が incrementable をモデル化する場合のみであり、そうでない場合は LegacyInputIterator を満たしません。
セマンティック要件
I
は
decrementable
をモデル化するのは、
I
が
decrementable
を満たし、それが包含するすべてのコンセプトがモデル化されており、かつ型
I
の等しいオブジェクト
a
と
b
が与えられたとき、以下の条件が満たされる場合に限る:
-
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
denote
/*iota-diff-t*/
<
I
>
. Type
I
models
advanceable
only if
I
satisfies
advanceable
and all concepts it subsumes are modeled, and given
-
型
Iのオブジェクト a と b 、および -
型
Dの値 n 、
以下のすべての条件が満たされる場合、 b は a から n 回の ++ a 適用後に到達可能である:
- ( a + = n ) は b と等しい。
- std:: addressof ( a + = n ) は std:: addressof ( a ) と等しい。
- I ( a + n ) は ( a + = n ) と等しい。
-
型
Dの任意の正の値 x と y について、 I ( a + D ( x + y ) ) が適切に定義されている場合、 I ( a + D ( x + y ) ) は I ( I ( a + x ) + y ) と等しい。 - I ( a + D ( 0 ) ) は a と等しい。
- I ( a + D ( n - 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
|
イテレータタグ 、下記参照 |
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) | (since C++20) |
|
constexpr
explicit
/*iterator*/
(
W value
)
;
|
(2) | (since 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; // 一時オブジェクトにバインド 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_; と等価。
auto tmp = *this; ++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
を返します:
例
#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
を返します:
例
#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以降) | |
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以降) |
!=
演算子は
synthesized
され、
operator==
から生成されます。
これらの関数は通常の unqualified lookup または qualified lookup では可視化されず、 argument-dependent lookup によってのみ発見可能です( 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以降) |
i -= n; return i; と等価。
D を difference_type とする:
-
Wが 整数様型 の場合:-
Wが符号付き整数様の場合、D(D(x.value_) - D(y.value_))を返す。 -
それ以外の場合、
y.value_ > x.value_ ? D(-D(y.value_ - x.value_)) : D(x.value_ - y.value_)を返す。
-
-
それ以外の場合、
x.value_ - y.value_を返す。
これらの関数は通常の 非修飾名探索 または 修飾名探索 では可視化されず、 iterator が引数の関連クラスである場合にのみ 実引数依存の名前探索 によって発見される。
不具合報告
以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| P2259R1 | C++20 |
メンバー
iterator_category
は常に定義される
|
W
が
incrementable
を満たす場合のみ定義される
|
| LWG 3580 | C++20 | operator + および operator - の本体が 暗黙のmove を妨げる | 暗黙のmoveに適するように修正 |