std::ranges::iota_view<W, Bound>::iota_view
ja.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 を構築します。
2)
value_ を value で初期化し、bound_ を値初期化します。
- 以下の場合、動作は未定義です:
Boundが std::unreachable_sentinel_t ではなく、かつBound()がvalueから到達可能でない場合。std::totally_ordered_with<W, Bound>がモデル化され、かつbool(value <= Bound())がfalseである場合。
3)
value_ を value で初期化し、bound_ を bound で初期化します。
- 以下の場合、動作は未定義です:
Boundが std::unreachable_sentinel_t ではなく、かつboundがvalueから到達可能でない場合。std::totally_ordered_with<W, Bound>がモデル化され、かつbool(value <= bound)がfalseである場合。
4)
value_ を W に格納されている first 値で初期化し、bound_ を Bound で表現される last 値(これは end() の型と同じ型を持ちます)で初期化します。
WとBoundが同じ型である場合、iota_view(first.value_, last.value_)と同等です。- そうでなく、
Boundが std::unreachable_sentinel_t である場合、iota_view(first.value_, last)と同等です。 - そうでない場合、
iota_view(first.value_, 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++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
| LWG 3523 | C++20 | オーバーロード (4) が誤ったセンチネル型を使用する可能性あり | 修正済み |
| P2711R1 | C++20 | オーバーロード (3,4) が明示的ではなかった | 明示的に変更 |