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>;
};
|
(5) | (*설명 전용*) (6)(*설명 전용*) |
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>>;
};
|
(7) | (*설명 전용*) (8)(*설명 전용*) |
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은(는) 가장 넓은 정수 계열 타입 중 하나이며,/*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 ) ) 가 잘 정의되었다면, 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 tag , 아래 참조 |
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_
;
.
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가 unsigned-integer-like type 인 경우: -
그렇지 않은 경우,
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 - 의 본문이 암시적 이동 을 배제함 | 암시적 이동에 적합하도록 수정됨 |