tmp/tmpel_i1v3a/{from.md → to.md}
RENAMED
|
@@ -0,0 +1,676 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
## Range generators <a id="coro.generator">[[coro.generator]]</a>
|
| 2 |
+
|
| 3 |
+
### Overview <a id="coroutine.generator.overview">[[coroutine.generator.overview]]</a>
|
| 4 |
+
|
| 5 |
+
Class template `generator` presents a view of the elements yielded by
|
| 6 |
+
the evaluation of a coroutine.
|
| 7 |
+
|
| 8 |
+
A `generator` generates a sequence of elements by repeatedly resuming
|
| 9 |
+
the coroutine from which it was returned. Elements of the sequence are
|
| 10 |
+
produced by the coroutine each time a `co_yield` statement is evaluated.
|
| 11 |
+
When the `co_yield` statement is of the form `co_yield elements_of(r)`,
|
| 12 |
+
each element of the range `r` is successively produced as an element of
|
| 13 |
+
the sequence.
|
| 14 |
+
|
| 15 |
+
[*Example 1*:
|
| 16 |
+
|
| 17 |
+
``` cpp
|
| 18 |
+
generator<int> ints(int start = 0) {
|
| 19 |
+
while (true)
|
| 20 |
+
co_yield start++;
|
| 21 |
+
}
|
| 22 |
+
|
| 23 |
+
void f() {
|
| 24 |
+
for (auto i : ints() | views::take(3))
|
| 25 |
+
cout << i << ' '; // prints 0 1 2
|
| 26 |
+
}
|
| 27 |
+
```
|
| 28 |
+
|
| 29 |
+
— *end example*]
|
| 30 |
+
|
| 31 |
+
### Header `<generator>` synopsis <a id="generator.syn">[[generator.syn]]</a>
|
| 32 |
+
|
| 33 |
+
``` cpp
|
| 34 |
+
namespace std {
|
| 35 |
+
// [coro.generator.class], class template generator
|
| 36 |
+
template<class Ref, class V = void, class Allocator = void>
|
| 37 |
+
class generator;
|
| 38 |
+
|
| 39 |
+
namespace pmr {
|
| 40 |
+
template<class R, class V = void>
|
| 41 |
+
using generator = std::generator<R, V, polymorphic_allocator<>>;
|
| 42 |
+
}
|
| 43 |
+
}
|
| 44 |
+
```
|
| 45 |
+
|
| 46 |
+
### Class template `generator` <a id="coro.generator.class">[[coro.generator.class]]</a>
|
| 47 |
+
|
| 48 |
+
``` cpp
|
| 49 |
+
namespace std {
|
| 50 |
+
template<class Ref, class V = void, class Allocator = void>
|
| 51 |
+
class generator : public ranges::view_interface<generator<Ref, V, Allocator>> {
|
| 52 |
+
private:
|
| 53 |
+
using value = conditional_t<is_void_v<V>, remove_cvref_t<Ref>, V>; // exposition only
|
| 54 |
+
using reference = conditional_t<is_void_v<V>, Ref&&, Ref>; // exposition only
|
| 55 |
+
|
| 56 |
+
// [coro.generator.iterator], class generator::iterator
|
| 57 |
+
class iterator; // exposition only
|
| 58 |
+
|
| 59 |
+
public:
|
| 60 |
+
using yielded =
|
| 61 |
+
conditional_t<is_reference_v<reference>, reference, const reference&>;
|
| 62 |
+
|
| 63 |
+
// [coro.generator.promise], class generator::promise_type
|
| 64 |
+
class promise_type;
|
| 65 |
+
|
| 66 |
+
generator(const generator&) = delete;
|
| 67 |
+
generator(generator&& other) noexcept;
|
| 68 |
+
|
| 69 |
+
~generator();
|
| 70 |
+
|
| 71 |
+
generator& operator=(generator other) noexcept;
|
| 72 |
+
|
| 73 |
+
iterator begin();
|
| 74 |
+
default_sentinel_t end() const noexcept;
|
| 75 |
+
|
| 76 |
+
private:
|
| 77 |
+
coroutine_handle<promise_type> coroutine_ = nullptr; // exposition only
|
| 78 |
+
unique_ptr<stack<coroutine_handle<>>> active_; // exposition only
|
| 79 |
+
};
|
| 80 |
+
}
|
| 81 |
+
```
|
| 82 |
+
|
| 83 |
+
*Mandates:*
|
| 84 |
+
|
| 85 |
+
- If `Allocator` is not `void`, `allocator_traits<Allocator>::pointer`
|
| 86 |
+
is a pointer type.
|
| 87 |
+
- *`value`* is a cv-unqualified object type.
|
| 88 |
+
- *`reference`* is either a reference type, or a cv-unqualified object
|
| 89 |
+
type that models `copy_constructible`.
|
| 90 |
+
- Let `RRef` denote `remove_reference_t<reference>&&` if *`reference`*
|
| 91 |
+
is a reference type, and *`reference`* otherwise. Each of:
|
| 92 |
+
- `common_reference_with<reference&&, value&>`,
|
| 93 |
+
- `common_reference_with<reference&&, RRef&&>`, and
|
| 94 |
+
- `\texttt{common_reference_with}<RRef&&, const \exposid{value}&>`
|
| 95 |
+
|
| 96 |
+
is modeled.
|
| 97 |
+
\[*Note 1*: These requirements ensure the exposition-only *`iterator`*
|
| 98 |
+
type can model `indirectly_readable` and thus
|
| 99 |
+
`input_iterator`. — *end note*]
|
| 100 |
+
|
| 101 |
+
If `Allocator` is not `void`, it shall meet the *Cpp17Allocator*
|
| 102 |
+
requirements.
|
| 103 |
+
|
| 104 |
+
Specializations of `generator` model `view` and `input_range`.
|
| 105 |
+
|
| 106 |
+
The behavior of a program that adds a specialization for `generator` is
|
| 107 |
+
undefined.
|
| 108 |
+
|
| 109 |
+
### Members <a id="coro.generator.members">[[coro.generator.members]]</a>
|
| 110 |
+
|
| 111 |
+
``` cpp
|
| 112 |
+
generator(generator&& other) noexcept;
|
| 113 |
+
```
|
| 114 |
+
|
| 115 |
+
*Effects:* Initializes *coroutine\_* with
|
| 116 |
+
`exchange(other.`*`coroutine_`*`, {})` and *active\_* with
|
| 117 |
+
`exchange(other.active_, nullptr)`.
|
| 118 |
+
|
| 119 |
+
[*Note 1*: Iterators previously obtained from `other` are not
|
| 120 |
+
invalidated; they become iterators into `*this`. — *end note*]
|
| 121 |
+
|
| 122 |
+
``` cpp
|
| 123 |
+
~generator();
|
| 124 |
+
```
|
| 125 |
+
|
| 126 |
+
*Effects:* Equivalent to:
|
| 127 |
+
|
| 128 |
+
``` cpp
|
| 129 |
+
if (coroutine_) {
|
| 130 |
+
coroutine_.destroy();
|
| 131 |
+
}
|
| 132 |
+
```
|
| 133 |
+
|
| 134 |
+
[*Note 2*: Ownership of recursively yielded generators is held in
|
| 135 |
+
awaitable objects in the coroutine frame of the yielding generator, so
|
| 136 |
+
destroying the root generator effectively destroys the entire stack of
|
| 137 |
+
yielded generators. — *end note*]
|
| 138 |
+
|
| 139 |
+
``` cpp
|
| 140 |
+
generator& operator=(generator other) noexcept;
|
| 141 |
+
```
|
| 142 |
+
|
| 143 |
+
*Effects:* Equivalent to:
|
| 144 |
+
|
| 145 |
+
``` cpp
|
| 146 |
+
swap(coroutine_, other.coroutine_);
|
| 147 |
+
swap(active_, other.active_);
|
| 148 |
+
```
|
| 149 |
+
|
| 150 |
+
*Returns:* `*this`.
|
| 151 |
+
|
| 152 |
+
[*Note 3*: Iterators previously obtained from `other` are not
|
| 153 |
+
invalidated; they become iterators into `*this`. — *end note*]
|
| 154 |
+
|
| 155 |
+
``` cpp
|
| 156 |
+
iterator begin();
|
| 157 |
+
```
|
| 158 |
+
|
| 159 |
+
*Preconditions:* *coroutine\_* refers to a coroutine suspended at its
|
| 160 |
+
initial suspend point [[dcl.fct.def.coroutine]].
|
| 161 |
+
|
| 162 |
+
*Effects:* Pushes *coroutine\_* into `*`*`active_`*, then evaluates
|
| 163 |
+
*`coroutine_`*`.resume()`.
|
| 164 |
+
|
| 165 |
+
*Returns:* An *iterator* object whose member *coroutine\_* refers to the
|
| 166 |
+
same coroutine as does *coroutine\_*.
|
| 167 |
+
|
| 168 |
+
[*Note 4*: A program that calls `begin` more than once on the same
|
| 169 |
+
generator has undefined behavior. — *end note*]
|
| 170 |
+
|
| 171 |
+
``` cpp
|
| 172 |
+
default_sentinel_t end() const noexcept;
|
| 173 |
+
```
|
| 174 |
+
|
| 175 |
+
*Returns:* `default_sentinel`.
|
| 176 |
+
|
| 177 |
+
### Class `generator::promise_type` <a id="coro.generator.promise">[[coro.generator.promise]]</a>
|
| 178 |
+
|
| 179 |
+
``` cpp
|
| 180 |
+
namespace std {
|
| 181 |
+
template<class Ref, class V, class Allocator>
|
| 182 |
+
class generator<Ref, V, Allocator>::promise_type {
|
| 183 |
+
public:
|
| 184 |
+
generator get_return_object() noexcept;
|
| 185 |
+
|
| 186 |
+
suspend_always initial_suspend() const noexcept { return {}; }
|
| 187 |
+
auto final_suspend() noexcept;
|
| 188 |
+
|
| 189 |
+
suspend_always yield_value(yielded val) noexcept;
|
| 190 |
+
|
| 191 |
+
auto yield_value(const remove_reference_t<yielded>& lval)
|
| 192 |
+
requires is_rvalue_reference_v<yielded> &&
|
| 193 |
+
constructible_from<remove_cvref_t<yielded>, const remove_reference_t<yielded>&>;
|
| 194 |
+
|
| 195 |
+
template<class R2, class V2, class Alloc2, class Unused>
|
| 196 |
+
requires same_as<typename generator<R2, V2, Alloc2>::yielded, yielded>
|
| 197 |
+
auto yield_value(ranges::elements_of<generator<R2, V2, Alloc2>&&, Unused> g) noexcept;
|
| 198 |
+
|
| 199 |
+
template<ranges::input_range R, class Alloc>
|
| 200 |
+
requires convertible_to<ranges::range_reference_t<R>, yielded>
|
| 201 |
+
auto yield_value(ranges::elements_of<R, Alloc> r) noexcept;
|
| 202 |
+
|
| 203 |
+
void await_transform() = delete;
|
| 204 |
+
|
| 205 |
+
void return_void() const noexcept {}
|
| 206 |
+
void unhandled_exception();
|
| 207 |
+
|
| 208 |
+
void* operator new(size_t size)
|
| 209 |
+
requires same_as<Allocator, void> || default_initializable<Allocator>;
|
| 210 |
+
|
| 211 |
+
template<class Alloc, class... Args>
|
| 212 |
+
requires same_as<Allocator, void> || convertible_to<const Alloc&, Allocator>
|
| 213 |
+
void* operator new(size_t size, allocator_arg_t, const Alloc& alloc, const Args&...);
|
| 214 |
+
|
| 215 |
+
template<class This, class Alloc, class... Args>
|
| 216 |
+
requires same_as<Allocator, void> || convertible_to<const Alloc&, Allocator>
|
| 217 |
+
void* operator new(size_t size, const This&, allocator_arg_t, const Alloc& alloc,
|
| 218 |
+
const Args&...);
|
| 219 |
+
|
| 220 |
+
void operator delete(void* pointer, size_t size) noexcept;
|
| 221 |
+
|
| 222 |
+
private:
|
| 223 |
+
add_pointer_t<yielded> value_ = nullptr; // exposition only
|
| 224 |
+
exception_ptr except_; // exposition only
|
| 225 |
+
};
|
| 226 |
+
}
|
| 227 |
+
```
|
| 228 |
+
|
| 229 |
+
``` cpp
|
| 230 |
+
generator get_return_object() noexcept;
|
| 231 |
+
```
|
| 232 |
+
|
| 233 |
+
*Returns:* A `generator` object whose member *coroutine\_* is
|
| 234 |
+
`coroutine_handle<promise_type>::from_promise(*this)`, and whose member
|
| 235 |
+
*active\_* points to an empty stack.
|
| 236 |
+
|
| 237 |
+
``` cpp
|
| 238 |
+
auto final_suspend() noexcept;
|
| 239 |
+
```
|
| 240 |
+
|
| 241 |
+
*Preconditions:* A handle referring to the coroutine whose promise
|
| 242 |
+
object is `*this` is at the top of `*`*`active_`* of some `generator`
|
| 243 |
+
object `x`. This function is called by that coroutine upon reaching its
|
| 244 |
+
final suspend point [[dcl.fct.def.coroutine]].
|
| 245 |
+
|
| 246 |
+
*Returns:* An awaitable object of unspecified type [[expr.await]] whose
|
| 247 |
+
member functions arrange for the calling coroutine to be suspended, pop
|
| 248 |
+
the coroutine handle from the top of `*x.`*`active_`*, and resume
|
| 249 |
+
execution of the coroutine referred to by `x.`*`active_`*`->top()` if
|
| 250 |
+
`*x.`*`active_`* is not empty. If it is empty, control flow returns to
|
| 251 |
+
the current coroutine caller or resumer [[dcl.fct.def.coroutine]].
|
| 252 |
+
|
| 253 |
+
``` cpp
|
| 254 |
+
suspend_always yield_value(yielded val) noexcept;
|
| 255 |
+
```
|
| 256 |
+
|
| 257 |
+
*Effects:* Equivalent to *`value_`*` = addressof(val)`.
|
| 258 |
+
|
| 259 |
+
*Returns:* `{}`.
|
| 260 |
+
|
| 261 |
+
``` cpp
|
| 262 |
+
auto yield_value(const remove_reference_t<yielded>& lval)
|
| 263 |
+
requires is_rvalue_reference_v<yielded> &&
|
| 264 |
+
constructible_from<remove_cvref_t<yielded>, const remove_reference_t<yielded>&>;
|
| 265 |
+
```
|
| 266 |
+
|
| 267 |
+
*Preconditions:* A handle referring to the coroutine whose promise
|
| 268 |
+
object is `*this` is at the top of `*`*`active_`* of some `generator`
|
| 269 |
+
object.
|
| 270 |
+
|
| 271 |
+
*Returns:* An awaitable object of an unspecified type [[expr.await]]
|
| 272 |
+
that stores an object of type `remove_cvref_t<yielded>`
|
| 273 |
+
direct-non-list-initialized with `lval`, whose member functions arrange
|
| 274 |
+
for *value\_* to point to that stored object and then suspend the
|
| 275 |
+
coroutine.
|
| 276 |
+
|
| 277 |
+
*Throws:* Any exception thrown by the initialization of the stored
|
| 278 |
+
object.
|
| 279 |
+
|
| 280 |
+
*Remarks:* A *yield-expression* that calls this function has type `void`
|
| 281 |
+
[[expr.yield]].
|
| 282 |
+
|
| 283 |
+
``` cpp
|
| 284 |
+
template<class R2, class V2, class Alloc2, class Unused>
|
| 285 |
+
requires same_as<typename generator<R2, V2, Alloc2>::yielded, yielded>
|
| 286 |
+
auto yield_value(ranges::elements_of<generator<R2, V2, Alloc2>&&, Unused> g) noexcept;
|
| 287 |
+
```
|
| 288 |
+
|
| 289 |
+
*Preconditions:* A handle referring to the coroutine whose promise
|
| 290 |
+
object is `*this` is at the top of `*`*`active_`* of some `generator`
|
| 291 |
+
object `x`. The coroutine referred to by `g.range.`*`coroutine_`* is
|
| 292 |
+
suspended at its initial suspend point.
|
| 293 |
+
|
| 294 |
+
*Returns:* An awaitable object of an unspecified type [[expr.await]]
|
| 295 |
+
into which `g.range` is moved, whose member `await_ready` returns
|
| 296 |
+
`false`, whose member `await_suspend` pushes
|
| 297 |
+
`g.range.`\textit{coroutine\_} into `*x.`*`active_`* and resumes
|
| 298 |
+
execution of the coroutine referred to by `g.range.`*`coroutine_`*, and
|
| 299 |
+
whose member `await_resume` evaluates `rethrow_exception(`*`except_`*`)`
|
| 300 |
+
if `bool(`*`except_`*`)` is `true`. If `bool(`*`except_`*`)` is `false`,
|
| 301 |
+
the `await_resume` member has no effects.
|
| 302 |
+
|
| 303 |
+
*Remarks:* A *yield-expression* that calls this function has type `void`
|
| 304 |
+
[[expr.yield]].
|
| 305 |
+
|
| 306 |
+
``` cpp
|
| 307 |
+
template<ranges::input_range R, class Alloc>
|
| 308 |
+
requires convertible_to<ranges::range_reference_t<R>, yielded>
|
| 309 |
+
auto yield_value(ranges::elements_of<R, Alloc> r) noexcept;
|
| 310 |
+
```
|
| 311 |
+
|
| 312 |
+
*Effects:* Equivalent to:
|
| 313 |
+
|
| 314 |
+
``` cpp
|
| 315 |
+
auto nested = [](allocator_arg_t, Alloc, ranges::iterator_t<R> i, ranges::sentinel_t<R> s)
|
| 316 |
+
-> generator<yielded, ranges::range_value_t<R>, Alloc> {
|
| 317 |
+
for (; i != s; ++i) {
|
| 318 |
+
co_yield static_cast<yielded>(*i);
|
| 319 |
+
}
|
| 320 |
+
};
|
| 321 |
+
return yield_value(ranges::elements_of(nested(
|
| 322 |
+
allocator_arg, r.allocator, ranges::begin(r.range), ranges::end(r.range))));
|
| 323 |
+
```
|
| 324 |
+
|
| 325 |
+
[*Note 1*: A *yield-expression* that calls this function has type
|
| 326 |
+
`void` [[expr.yield]]. — *end note*]
|
| 327 |
+
|
| 328 |
+
``` cpp
|
| 329 |
+
void unhandled_exception();
|
| 330 |
+
```
|
| 331 |
+
|
| 332 |
+
*Preconditions:* A handle referring to the coroutine whose promise
|
| 333 |
+
object is `*this` is at the top of `*`*`active_`* of some `generator`
|
| 334 |
+
object `x`.
|
| 335 |
+
|
| 336 |
+
*Effects:* If the handle referring to the coroutine whose promise object
|
| 337 |
+
is `*this` is the sole element of `*x.`*`active_`*, equivalent to
|
| 338 |
+
`throw`, otherwise, assigns `current_exception()` to *except\_*.
|
| 339 |
+
|
| 340 |
+
``` cpp
|
| 341 |
+
void* operator new(size_t size)
|
| 342 |
+
requires same_as<Allocator, void> || default_initializable<Allocator>;
|
| 343 |
+
|
| 344 |
+
template<class Alloc, class... Args>
|
| 345 |
+
requires same_as<Allocator, void> || convertible_to<const Alloc&, Allocator>
|
| 346 |
+
void* operator new(size_t size, allocator_arg_t, const Alloc& alloc, const Args&...);
|
| 347 |
+
|
| 348 |
+
template<class This, class Alloc, class... Args>
|
| 349 |
+
requires same_as<Allocator, void> || convertible_to<const Alloc&, Allocator>
|
| 350 |
+
void* operator new(size_t size, const This&, allocator_arg_t, const Alloc& alloc,
|
| 351 |
+
const Args&...);
|
| 352 |
+
```
|
| 353 |
+
|
| 354 |
+
Let `A` be
|
| 355 |
+
|
| 356 |
+
- `Allocator`, if it is not `void`,
|
| 357 |
+
- `Alloc` for the overloads with a template parameter `Alloc`, or
|
| 358 |
+
- `allocator<void>` otherwise.
|
| 359 |
+
|
| 360 |
+
Let `B` be `allocator_traits<A>::template rebind_alloc<U>` where `U` is
|
| 361 |
+
an unspecified type whose size and alignment are both
|
| 362 |
+
\_\_STDCPP_DEFAULT_NEW_ALIGNMENT\_\_.
|
| 363 |
+
|
| 364 |
+
*Mandates:* `allocator_traits<B>::pointer` is a pointer type.
|
| 365 |
+
|
| 366 |
+
*Effects:* Initializes an allocator `b` of type `B` with `A(alloc)`, for
|
| 367 |
+
the overloads with a function parameter `alloc`, and with `A()`
|
| 368 |
+
otherwise. Uses `b` to allocate storage for the smallest array of `U`
|
| 369 |
+
sufficient to provide storage for a coroutine state of size `size`, and
|
| 370 |
+
unspecified additional state necessary to ensure that `operator delete`
|
| 371 |
+
can later deallocate this memory block with an allocator equal to `b`.
|
| 372 |
+
|
| 373 |
+
*Returns:* A pointer to the allocated storage.
|
| 374 |
+
|
| 375 |
+
``` cpp
|
| 376 |
+
void operator delete(void* pointer, size_t size) noexcept;
|
| 377 |
+
```
|
| 378 |
+
|
| 379 |
+
*Preconditions:* `pointer` was returned from an invocation of one of the
|
| 380 |
+
above overloads of `operator new` with a `size` argument equal to
|
| 381 |
+
`size`.
|
| 382 |
+
|
| 383 |
+
*Effects:* Deallocates the storage pointed to by `pointer` using an
|
| 384 |
+
allocator equivalent to that used to allocate it.
|
| 385 |
+
|
| 386 |
+
### Class `generator::iterator` <a id="coro.generator.iterator">[[coro.generator.iterator]]</a>
|
| 387 |
+
|
| 388 |
+
``` cpp
|
| 389 |
+
namespace std {
|
| 390 |
+
template<class Ref, class V, class Allocator>
|
| 391 |
+
class generator<Ref, V, Allocator>::iterator {
|
| 392 |
+
public:
|
| 393 |
+
using value_type = value;
|
| 394 |
+
using difference_type = ptrdiff_t;
|
| 395 |
+
|
| 396 |
+
iterator(iterator&& other) noexcept;
|
| 397 |
+
iterator& operator=(iterator&& other) noexcept;
|
| 398 |
+
|
| 399 |
+
reference operator*() const noexcept(is_nothrow_copy_constructible_v<reference>);
|
| 400 |
+
iterator& operator++();
|
| 401 |
+
void operator++(int);
|
| 402 |
+
|
| 403 |
+
friend bool operator==(const iterator& i, default_sentinel_t);
|
| 404 |
+
|
| 405 |
+
private:
|
| 406 |
+
coroutine_handle<promise_type> coroutine_; // exposition only
|
| 407 |
+
};
|
| 408 |
+
}
|
| 409 |
+
```
|
| 410 |
+
|
| 411 |
+
``` cpp
|
| 412 |
+
iterator(iterator&& other) noexcept;
|
| 413 |
+
```
|
| 414 |
+
|
| 415 |
+
*Effects:* Initializes *coroutine\_* with
|
| 416 |
+
`exchange(other.`*`coroutine_`*`, {})`.
|
| 417 |
+
|
| 418 |
+
``` cpp
|
| 419 |
+
iterator& operator=(iterator&& other) noexcept;
|
| 420 |
+
```
|
| 421 |
+
|
| 422 |
+
*Effects:* Equivalent to
|
| 423 |
+
*`coroutine_`*` = exchange(other.`*`coroutine_`*`, {})`.
|
| 424 |
+
|
| 425 |
+
*Returns:* `*this`.
|
| 426 |
+
|
| 427 |
+
``` cpp
|
| 428 |
+
reference operator*() const noexcept(is_nothrow_copy_constructible_v<reference>);
|
| 429 |
+
```
|
| 430 |
+
|
| 431 |
+
*Preconditions:* For some `generator` object `x`, *coroutine\_* is in
|
| 432 |
+
`*x.`*`active_`* and `x.`*`active_`*`->top()` refers to a suspended
|
| 433 |
+
coroutine with promise object `p`.
|
| 434 |
+
|
| 435 |
+
*Effects:* Equivalent to:
|
| 436 |
+
`return static_cast<`*`reference`*`>(*p.`*`value_`*`);`
|
| 437 |
+
|
| 438 |
+
``` cpp
|
| 439 |
+
iterator& operator++();
|
| 440 |
+
```
|
| 441 |
+
|
| 442 |
+
*Preconditions:* For some `generator` object `x`, *coroutine\_* is in
|
| 443 |
+
`*x.`*`active_`*.
|
| 444 |
+
|
| 445 |
+
*Effects:* Equivalent to `x.`*`active_`*`->top().resume()`.
|
| 446 |
+
|
| 447 |
+
*Returns:* `*this`.
|
| 448 |
+
|
| 449 |
+
``` cpp
|
| 450 |
+
void operator++(int);
|
| 451 |
+
```
|
| 452 |
+
|
| 453 |
+
*Effects:* Equivalent to `++*this`.
|
| 454 |
+
|
| 455 |
+
``` cpp
|
| 456 |
+
friend bool operator==(const iterator& i, default_sentinel_t);
|
| 457 |
+
```
|
| 458 |
+
|
| 459 |
+
*Effects:* Equivalent to: `return i.`*`coroutine_`*`.done();`
|
| 460 |
+
|
| 461 |
+
<!-- Link reference definitions -->
|
| 462 |
+
[basic.lookup.argdep]: basic.md#basic.lookup.argdep
|
| 463 |
+
[concepts.equality]: concepts.md#concepts.equality
|
| 464 |
+
[containers]: containers.md#containers
|
| 465 |
+
[conv.rval]: expr.md#conv.rval
|
| 466 |
+
[coro.generator]: #coro.generator
|
| 467 |
+
[coro.generator.class]: #coro.generator.class
|
| 468 |
+
[coro.generator.iterator]: #coro.generator.iterator
|
| 469 |
+
[coro.generator.members]: #coro.generator.members
|
| 470 |
+
[coro.generator.promise]: #coro.generator.promise
|
| 471 |
+
[coroutine.generator.overview]: #coroutine.generator.overview
|
| 472 |
+
[customization.point.object]: library.md#customization.point.object
|
| 473 |
+
[dcl.fct.def.coroutine]: dcl.md#dcl.fct.def.coroutine
|
| 474 |
+
[dcl.init.general]: dcl.md#dcl.init.general
|
| 475 |
+
[expr.await]: expr.md#expr.await
|
| 476 |
+
[expr.const]: expr.md#expr.const
|
| 477 |
+
[expr.yield]: expr.md#expr.yield
|
| 478 |
+
[generator.syn]: #generator.syn
|
| 479 |
+
[iterator.concept.bidir]: iterators.md#iterator.concept.bidir
|
| 480 |
+
[iterator.concept.forward]: iterators.md#iterator.concept.forward
|
| 481 |
+
[iterator.concept.iterator]: iterators.md#iterator.concept.iterator
|
| 482 |
+
[iterator.concept.output]: iterators.md#iterator.concept.output
|
| 483 |
+
[iterator.concept.random.access]: iterators.md#iterator.concept.random.access
|
| 484 |
+
[iterator.concept.sizedsentinel]: iterators.md#iterator.concept.sizedsentinel
|
| 485 |
+
[iterator.concept.winc]: iterators.md#iterator.concept.winc
|
| 486 |
+
[iterator.requirements.general]: iterators.md#iterator.requirements.general
|
| 487 |
+
[namespace.std]: library.md#namespace.std
|
| 488 |
+
[range.access]: #range.access
|
| 489 |
+
[range.access.begin]: #range.access.begin
|
| 490 |
+
[range.access.cbegin]: #range.access.cbegin
|
| 491 |
+
[range.access.cend]: #range.access.cend
|
| 492 |
+
[range.access.crbegin]: #range.access.crbegin
|
| 493 |
+
[range.access.crend]: #range.access.crend
|
| 494 |
+
[range.access.end]: #range.access.end
|
| 495 |
+
[range.access.general]: #range.access.general
|
| 496 |
+
[range.access.rbegin]: #range.access.rbegin
|
| 497 |
+
[range.access.rend]: #range.access.rend
|
| 498 |
+
[range.adaptor.helpers]: #range.adaptor.helpers
|
| 499 |
+
[range.adaptor.object]: #range.adaptor.object
|
| 500 |
+
[range.adaptors]: #range.adaptors
|
| 501 |
+
[range.adaptors.general]: #range.adaptors.general
|
| 502 |
+
[range.adjacent]: #range.adjacent
|
| 503 |
+
[range.adjacent.iterator]: #range.adjacent.iterator
|
| 504 |
+
[range.adjacent.overview]: #range.adjacent.overview
|
| 505 |
+
[range.adjacent.sentinel]: #range.adjacent.sentinel
|
| 506 |
+
[range.adjacent.transform]: #range.adjacent.transform
|
| 507 |
+
[range.adjacent.transform.iterator]: #range.adjacent.transform.iterator
|
| 508 |
+
[range.adjacent.transform.overview]: #range.adjacent.transform.overview
|
| 509 |
+
[range.adjacent.transform.sentinel]: #range.adjacent.transform.sentinel
|
| 510 |
+
[range.adjacent.transform.view]: #range.adjacent.transform.view
|
| 511 |
+
[range.adjacent.view]: #range.adjacent.view
|
| 512 |
+
[range.all]: #range.all
|
| 513 |
+
[range.all.general]: #range.all.general
|
| 514 |
+
[range.as.const]: #range.as.const
|
| 515 |
+
[range.as.const.overview]: #range.as.const.overview
|
| 516 |
+
[range.as.const.view]: #range.as.const.view
|
| 517 |
+
[range.as.rvalue]: #range.as.rvalue
|
| 518 |
+
[range.as.rvalue.overview]: #range.as.rvalue.overview
|
| 519 |
+
[range.as.rvalue.view]: #range.as.rvalue.view
|
| 520 |
+
[range.cartesian]: #range.cartesian
|
| 521 |
+
[range.cartesian.iterator]: #range.cartesian.iterator
|
| 522 |
+
[range.cartesian.overview]: #range.cartesian.overview
|
| 523 |
+
[range.cartesian.view]: #range.cartesian.view
|
| 524 |
+
[range.chunk]: #range.chunk
|
| 525 |
+
[range.chunk.by]: #range.chunk.by
|
| 526 |
+
[range.chunk.by.iter]: #range.chunk.by.iter
|
| 527 |
+
[range.chunk.by.overview]: #range.chunk.by.overview
|
| 528 |
+
[range.chunk.by.view]: #range.chunk.by.view
|
| 529 |
+
[range.chunk.fwd.iter]: #range.chunk.fwd.iter
|
| 530 |
+
[range.chunk.inner.iter]: #range.chunk.inner.iter
|
| 531 |
+
[range.chunk.outer.iter]: #range.chunk.outer.iter
|
| 532 |
+
[range.chunk.outer.value]: #range.chunk.outer.value
|
| 533 |
+
[range.chunk.overview]: #range.chunk.overview
|
| 534 |
+
[range.chunk.view.fwd]: #range.chunk.view.fwd
|
| 535 |
+
[range.chunk.view.input]: #range.chunk.view.input
|
| 536 |
+
[range.common]: #range.common
|
| 537 |
+
[range.common.overview]: #range.common.overview
|
| 538 |
+
[range.common.view]: #range.common.view
|
| 539 |
+
[range.counted]: #range.counted
|
| 540 |
+
[range.dangling]: #range.dangling
|
| 541 |
+
[range.drop]: #range.drop
|
| 542 |
+
[range.drop.overview]: #range.drop.overview
|
| 543 |
+
[range.drop.view]: #range.drop.view
|
| 544 |
+
[range.drop.while]: #range.drop.while
|
| 545 |
+
[range.drop.while.overview]: #range.drop.while.overview
|
| 546 |
+
[range.drop.while.view]: #range.drop.while.view
|
| 547 |
+
[range.elements]: #range.elements
|
| 548 |
+
[range.elements.iterator]: #range.elements.iterator
|
| 549 |
+
[range.elements.overview]: #range.elements.overview
|
| 550 |
+
[range.elements.sentinel]: #range.elements.sentinel
|
| 551 |
+
[range.elements.view]: #range.elements.view
|
| 552 |
+
[range.elementsof]: #range.elementsof
|
| 553 |
+
[range.empty]: #range.empty
|
| 554 |
+
[range.empty.overview]: #range.empty.overview
|
| 555 |
+
[range.empty.view]: #range.empty.view
|
| 556 |
+
[range.enumerate]: #range.enumerate
|
| 557 |
+
[range.enumerate.iterator]: #range.enumerate.iterator
|
| 558 |
+
[range.enumerate.overview]: #range.enumerate.overview
|
| 559 |
+
[range.enumerate.sentinel]: #range.enumerate.sentinel
|
| 560 |
+
[range.enumerate.view]: #range.enumerate.view
|
| 561 |
+
[range.factories]: #range.factories
|
| 562 |
+
[range.factories.general]: #range.factories.general
|
| 563 |
+
[range.filter]: #range.filter
|
| 564 |
+
[range.filter.iterator]: #range.filter.iterator
|
| 565 |
+
[range.filter.overview]: #range.filter.overview
|
| 566 |
+
[range.filter.sentinel]: #range.filter.sentinel
|
| 567 |
+
[range.filter.view]: #range.filter.view
|
| 568 |
+
[range.iota]: #range.iota
|
| 569 |
+
[range.iota.iterator]: #range.iota.iterator
|
| 570 |
+
[range.iota.overview]: #range.iota.overview
|
| 571 |
+
[range.iota.sentinel]: #range.iota.sentinel
|
| 572 |
+
[range.iota.view]: #range.iota.view
|
| 573 |
+
[range.istream]: #range.istream
|
| 574 |
+
[range.istream.iterator]: #range.istream.iterator
|
| 575 |
+
[range.istream.overview]: #range.istream.overview
|
| 576 |
+
[range.istream.view]: #range.istream.view
|
| 577 |
+
[range.join]: #range.join
|
| 578 |
+
[range.join.iterator]: #range.join.iterator
|
| 579 |
+
[range.join.overview]: #range.join.overview
|
| 580 |
+
[range.join.sentinel]: #range.join.sentinel
|
| 581 |
+
[range.join.view]: #range.join.view
|
| 582 |
+
[range.join.with]: #range.join.with
|
| 583 |
+
[range.join.with.iterator]: #range.join.with.iterator
|
| 584 |
+
[range.join.with.overview]: #range.join.with.overview
|
| 585 |
+
[range.join.with.sentinel]: #range.join.with.sentinel
|
| 586 |
+
[range.join.with.view]: #range.join.with.view
|
| 587 |
+
[range.lazy.split]: #range.lazy.split
|
| 588 |
+
[range.lazy.split.inner]: #range.lazy.split.inner
|
| 589 |
+
[range.lazy.split.outer]: #range.lazy.split.outer
|
| 590 |
+
[range.lazy.split.outer.value]: #range.lazy.split.outer.value
|
| 591 |
+
[range.lazy.split.overview]: #range.lazy.split.overview
|
| 592 |
+
[range.lazy.split.view]: #range.lazy.split.view
|
| 593 |
+
[range.move.wrap]: #range.move.wrap
|
| 594 |
+
[range.nonprop.cache]: #range.nonprop.cache
|
| 595 |
+
[range.owning.view]: #range.owning.view
|
| 596 |
+
[range.prim.cdata]: #range.prim.cdata
|
| 597 |
+
[range.prim.data]: #range.prim.data
|
| 598 |
+
[range.prim.empty]: #range.prim.empty
|
| 599 |
+
[range.prim.size]: #range.prim.size
|
| 600 |
+
[range.prim.ssize]: #range.prim.ssize
|
| 601 |
+
[range.range]: #range.range
|
| 602 |
+
[range.ref.view]: #range.ref.view
|
| 603 |
+
[range.refinements]: #range.refinements
|
| 604 |
+
[range.repeat]: #range.repeat
|
| 605 |
+
[range.repeat.iterator]: #range.repeat.iterator
|
| 606 |
+
[range.repeat.overview]: #range.repeat.overview
|
| 607 |
+
[range.repeat.view]: #range.repeat.view
|
| 608 |
+
[range.req]: #range.req
|
| 609 |
+
[range.req.general]: #range.req.general
|
| 610 |
+
[range.reverse]: #range.reverse
|
| 611 |
+
[range.reverse.overview]: #range.reverse.overview
|
| 612 |
+
[range.reverse.view]: #range.reverse.view
|
| 613 |
+
[range.single]: #range.single
|
| 614 |
+
[range.single.overview]: #range.single.overview
|
| 615 |
+
[range.single.view]: #range.single.view
|
| 616 |
+
[range.sized]: #range.sized
|
| 617 |
+
[range.slide]: #range.slide
|
| 618 |
+
[range.slide.iterator]: #range.slide.iterator
|
| 619 |
+
[range.slide.overview]: #range.slide.overview
|
| 620 |
+
[range.slide.sentinel]: #range.slide.sentinel
|
| 621 |
+
[range.slide.view]: #range.slide.view
|
| 622 |
+
[range.split]: #range.split
|
| 623 |
+
[range.split.iterator]: #range.split.iterator
|
| 624 |
+
[range.split.overview]: #range.split.overview
|
| 625 |
+
[range.split.sentinel]: #range.split.sentinel
|
| 626 |
+
[range.split.view]: #range.split.view
|
| 627 |
+
[range.stride]: #range.stride
|
| 628 |
+
[range.stride.iterator]: #range.stride.iterator
|
| 629 |
+
[range.stride.overview]: #range.stride.overview
|
| 630 |
+
[range.stride.view]: #range.stride.view
|
| 631 |
+
[range.subrange]: #range.subrange
|
| 632 |
+
[range.subrange.access]: #range.subrange.access
|
| 633 |
+
[range.subrange.ctor]: #range.subrange.ctor
|
| 634 |
+
[range.subrange.general]: #range.subrange.general
|
| 635 |
+
[range.summary]: #range.summary
|
| 636 |
+
[range.take]: #range.take
|
| 637 |
+
[range.take.overview]: #range.take.overview
|
| 638 |
+
[range.take.sentinel]: #range.take.sentinel
|
| 639 |
+
[range.take.view]: #range.take.view
|
| 640 |
+
[range.take.while]: #range.take.while
|
| 641 |
+
[range.take.while.overview]: #range.take.while.overview
|
| 642 |
+
[range.take.while.sentinel]: #range.take.while.sentinel
|
| 643 |
+
[range.take.while.view]: #range.take.while.view
|
| 644 |
+
[range.transform]: #range.transform
|
| 645 |
+
[range.transform.iterator]: #range.transform.iterator
|
| 646 |
+
[range.transform.overview]: #range.transform.overview
|
| 647 |
+
[range.transform.sentinel]: #range.transform.sentinel
|
| 648 |
+
[range.transform.view]: #range.transform.view
|
| 649 |
+
[range.utility]: #range.utility
|
| 650 |
+
[range.utility.conv]: #range.utility.conv
|
| 651 |
+
[range.utility.conv.adaptors]: #range.utility.conv.adaptors
|
| 652 |
+
[range.utility.conv.general]: #range.utility.conv.general
|
| 653 |
+
[range.utility.conv.to]: #range.utility.conv.to
|
| 654 |
+
[range.utility.general]: #range.utility.general
|
| 655 |
+
[range.utility.helpers]: #range.utility.helpers
|
| 656 |
+
[range.view]: #range.view
|
| 657 |
+
[range.zip]: #range.zip
|
| 658 |
+
[range.zip.iterator]: #range.zip.iterator
|
| 659 |
+
[range.zip.overview]: #range.zip.overview
|
| 660 |
+
[range.zip.sentinel]: #range.zip.sentinel
|
| 661 |
+
[range.zip.transform]: #range.zip.transform
|
| 662 |
+
[range.zip.transform.iterator]: #range.zip.transform.iterator
|
| 663 |
+
[range.zip.transform.overview]: #range.zip.transform.overview
|
| 664 |
+
[range.zip.transform.sentinel]: #range.zip.transform.sentinel
|
| 665 |
+
[range.zip.transform.view]: #range.zip.transform.view
|
| 666 |
+
[range.zip.view]: #range.zip.view
|
| 667 |
+
[ranges]: #ranges
|
| 668 |
+
[ranges.general]: #ranges.general
|
| 669 |
+
[ranges.syn]: #ranges.syn
|
| 670 |
+
[string.view]: strings.md#string.view
|
| 671 |
+
[term.array.type]: dcl.md#term.array.type
|
| 672 |
+
[term.perfect.forwarding.call.wrapper]: utilities.md#term.perfect.forwarding.call.wrapper
|
| 673 |
+
[view.interface]: #view.interface
|
| 674 |
+
[view.interface.general]: #view.interface.general
|
| 675 |
+
[view.interface.members]: #view.interface.members
|
| 676 |
+
[views.span]: containers.md#views.span
|