std::ranges::iota_view<W, Bound>:: iota_view
From cppreference.net
|
iota_view
(
)
requires
std::
default_initializable
<
W
>
=
default
;
|
(1) | (C++20 起) |
|
constexpr
explicit
iota_view
(
W value
)
;
|
(2) | (C++20 起) |
|
constexpr
explicit
iota_view
(
std::
type_identity_t
<
W
>
value,
std:: type_identity_t < Bound > bound ) ; |
(3) | (C++20 起) |
|
constexpr
explicit
iota_view
(
/*iterator*/
first,
/* see below */
last
)
;
|
(4) | (C++20 起) |
构造一个
iota_view
。
| 重载 | 数据成员 | |
|---|---|---|
value_
|
bound_
|
|
| (1) | 值初始化 | 值初始化 |
| (2) | 使用 value 初始化 | |
| (3) | 使用 bound 初始化 | |
| (4) |
使用
first.
value_
初始化
|
见下文 |
2,3)
若满足以下任一条件,则行为未定义:
-
从
value
无法到达
Bound
(
)
,除非
Bound表示 std::unreachable_sentinel_t 。 -
W和Bound满足totally_ordered_with概念,且 bool ( value <= bound ) 为 false 。
4)
若满足以下任意条件,则行为未定义:
-
从
value
无法到达
Bound
(
)
,除非
Bound表示 std::unreachable_sentinel_t 。 -
W和Bound满足totally_ordered_with概念,且 bool ( first.value_<= bound ) 为 false 。
last
的类型与
bound_
的初始化方式由类型
Bound
所表示的内容决定:
类型
Bound
表示的内容
|
last 的类型 |
bound_
|
|---|---|---|
W
|
iterator
|
通过
last.
value_
初始化
|
| std::unreachable_sentinel_t |
Bound
|
通过 last 初始化 |
| 其他任意类型 |
sentinel
|
通过
last.
bound_
初始化
|
参数
| value | - | 起始值 |
| bound | - | 边界值 |
| first | - | 表示起始值的迭代器 |
| last | - | 表示边界的迭代器或哨兵 |
示例
运行此代码
#include <cassert> #include <iostream> #include <iterator> #include <ranges> int main() { const auto l = {1, 2, 3, 4}; auto i1 = std::ranges::iota_view<int, int>(); // 重载 (1) assert(i1.empty() and i1.size() == 0); auto i2 = std::ranges::iota_view(1); // 重载 (2) assert(not i2.empty() and i2.front() == 1); for (std::cout << "1) "; auto e : i2 | std::views::take(3)) std::cout << e << ' '; std::cout << '\n'; auto i3 = std::ranges::iota_view(std::begin(l)); // 重载 (2) assert(not i3.empty() and i3.front() == l.begin()); for (std::cout << "2) "; auto e : i3 | std::views::take(4)) std::cout << *e << ' '; std::cout << '\n'; auto i4 = std::ranges::iota_view(1, 8); // 重载 (3) assert(not i4.empty() and i4.front() == 1 and i4.back() == 7); for (std::cout << "3) "; auto e : i4) std::cout << e << ' '; std::cout << '\n'; auto i5 = std::ranges::iota_view(l.begin(), l.end()); // 重载 (4) for (std::cout << "4) "; auto e : i5) std::cout << *e << ' '; std::cout << '\n'; auto i6 = std::ranges::iota_view(l.begin(), std::unreachable_sentinel); // (4) for (std::cout << "5) "; auto e : i6 | std::views::take(3)) std::cout << *e << ' '; std::cout << '\n'; }
输出:
1) 1 2 3 2) 1 2 3 4 3) 1 2 3 4 5 6 7 4) 1 2 3 4 5) 1 2 3
缺陷报告
下列行为变更缺陷报告被追溯应用于先前发布的 C++ 标准。
| 缺陷报告 | 应用于 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3523 | C++20 | 重载 (4) 可能使用了错误的哨兵类型 | 已修正 |
| P2711R1 | C++20 | 重载 (3,4) 不是显式的 | 改为显式 |