|
4 | 4 | <issue num="4226" status="New"> |
5 | 5 | <title><code>to_input_view::<i>iterator</i></code> cannot be compared to its `const` sentinel</title> |
6 | 6 | <section> |
7 | | -<sref ref="[range.to.input.view]"/> |
| 7 | +<sref ref="[range.to.input]"/> |
8 | 8 | </section> |
9 | 9 | <submitter>Hewill Kang</submitter> |
10 | 10 | <date>15 Mar 2025</date> |
@@ -53,6 +53,211 @@ I believe we may need to introduce a custom sentinel class for <code>to_input_vi |
53 | 53 | </discussion> |
54 | 54 |
|
55 | 55 | <resolution> |
| 56 | +<p> |
| 57 | +This wording is relative to the <a href="https://github.com/cplusplus/draft/actions/runs/13875532168/artifacts/2758179972"> |
| 58 | +working draft just after application of the Hagenberg motions</a>. |
| 59 | +</p> |
| 60 | + |
| 61 | +<ol> |
| 62 | + |
| 63 | +<li><p>Modify <sref ref="[range.to.input.view]"/> as indicated:</p> |
| 64 | + |
| 65 | +<blockquote> |
| 66 | +<blockquote> |
| 67 | +<pre> |
| 68 | +namespace std::ranges { |
| 69 | + template<input_range V> |
| 70 | + requires view<V> |
| 71 | + class to_input_view : public view_interface<to_input_view<V>> { |
| 72 | + V <i>base_</i> = V(); // <i>exposition only</i> |
| 73 | + |
| 74 | + template<bool Const> |
| 75 | + class <i>iterator</i>; // <i>exposition only</i> |
| 76 | + <ins>template<bool Const> |
| 77 | + class <i>sentinel</i>; // <i>exposition only</i></ins> |
| 78 | + […] |
| 79 | + }; |
| 80 | + […] |
| 81 | +} |
| 82 | +</pre> |
| 83 | +</blockquote> |
| 84 | +[…] |
| 85 | +<pre> |
| 86 | +constexpr auto end() requires (!<i>simple-view</i><V>); |
| 87 | +</pre> |
| 88 | +<blockquote> |
| 89 | +<p> |
| 90 | +<ins>-?- <i>Effects</i>: Equivalent to:</ins> |
| 91 | +</p> |
| 92 | +<pre> |
| 93 | +<ins>return <i>sentinel</i><false>(ranges::end(<i>base_</i>));</ins> |
| 94 | +</pre> |
| 95 | +</blockquote> |
| 96 | +<pre> |
| 97 | +constexpr auto end() const requires range<const V>; |
| 98 | +</pre> |
| 99 | +<blockquote> |
| 100 | +<p> |
| 101 | +-4- <i>Effects</i>: Equivalent to: |
| 102 | +</p> |
| 103 | +<pre> |
| 104 | +return <ins><i>sentinel</i><true>(</ins>ranges::end(<i>base_</i>)<ins>)</ins>; |
| 105 | +</pre> |
| 106 | +</blockquote> |
| 107 | +</blockquote> |
| 108 | +</li> |
| 109 | + |
| 110 | +<li><p>Modify <sref ref="[range.to.input.iterator]"/> as indicated:</p> |
| 111 | + |
| 112 | +<blockquote> |
| 113 | +<blockquote> |
| 114 | +<pre> |
| 115 | +namespace std::ranges { |
| 116 | + template<input_range V> |
| 117 | + requires view<V> |
| 118 | + template<bool Const> |
| 119 | + class to_input_view<V>::<i>iterator</i> { |
| 120 | + […] |
| 121 | + <del>friend constexpr bool operator==(const <i>iterator</i>& x, const sentinel_t<<i>Base</i>>& y); |
| 122 | + |
| 123 | + friend constexpr difference_type operator-(const sentinel_t<<i>Base</i>>& y, const <i>iterator</i>& x) |
| 124 | + requires sized_sentinel_for<sentinel_t<<i>Base</i>>, iterator_t<<i>Base</i>>>; |
| 125 | + friend constexpr difference_type operator-(const <i>iterator</i>& x, const sentinel_t<<i>Base</i>>& y) |
| 126 | + requires sized_sentinel_for<sentinel_t<<i>Base</i>>, iterator_t<<i>Base</i>>>;</del> |
| 127 | + […] |
| 128 | + }; |
| 129 | +} |
| 130 | +</pre> |
| 131 | +</blockquote> |
| 132 | +[…] |
| 133 | +<pre><del> |
| 134 | +friend constexpr bool operator==(const <i>iterator</i>& x, const sentinel_t<<i>Base</i>>& y);</del> |
| 135 | +</pre> |
| 136 | +<blockquote> |
| 137 | +<p> |
| 138 | +<del>-7- <i>Returns</i>: <code>x.<i>current_</i> == y</code>.</del> |
| 139 | +</p> |
| 140 | +</blockquote> |
| 141 | +<pre><del> |
| 142 | +friend constexpr difference_type operator-(const sentinel_t<<i>Base</i>>& y, const <i>iterator</i>& x) |
| 143 | + requires sized_sentinel_for<sentinel_t<<i>Base</i>>, iterator_t<<i>Base</i>>>;</del> |
| 144 | +</pre> |
| 145 | +<blockquote> |
| 146 | +<p> |
| 147 | +<del>-8- <i>Returns</i>: <code>y - x.<i>current_</i></code>.</del> |
| 148 | +</p> |
| 149 | +</blockquote> |
| 150 | +<pre><del> |
| 151 | +friend constexpr difference_type operator-(const <i>iterator</i>& x, const sentinel_t<<i>Base</i>>& y) |
| 152 | + requires sized_sentinel_for<sentinel_t<<i>Base</i>>, iterator_t<<i>Base</i>>>;</del> |
| 153 | +</pre> |
| 154 | +<blockquote> |
| 155 | +<p> |
| 156 | +<del>-9- <i>Returns</i>: <code>x.<i>current_</i> - y</code>.</del> |
| 157 | +</p> |
| 158 | +</blockquote> |
| 159 | +</blockquote> |
| 160 | +</li> |
| 161 | + |
| 162 | + |
| 163 | +<li><p>Add [range.to.input.sentinel] after [range.to.input.iterator] as indicated:</p> |
| 164 | + |
| 165 | +<blockquote> |
| 166 | +<blockquote> |
| 167 | +<pre><ins> |
| 168 | +namespace std::ranges { |
| 169 | + template<input_range V> |
| 170 | + requires view<V> |
| 171 | + template<bool Const> |
| 172 | + class to_input_view<V>::<i>sentinel</i> { |
| 173 | + using <i>Base</i> = <i>maybe-const</i><Const, V>; // <i>exposition only</i> |
| 174 | + sentinel_t<<i>Base</i>> <i>end_</i> = sentinel_t<<i>Base</i>>(); // <i>exposition only</i> |
| 175 | + constexpr explicit <i>sentinel</i>(sentinel_t<<i>Base</i>> end); // <i>exposition only</i> |
| 176 | + |
| 177 | + public: |
| 178 | + <i>sentinel</i>() = default; |
| 179 | + constexpr <i>sentinel</i>(<i>sentinel</i><!Const> other) |
| 180 | + requires Const && convertible_to<sentinel_t<V>, sentinel_t<<i>Base</i>>>; |
| 181 | + |
| 182 | + constexpr sentinel_t<Base> base() const; |
| 183 | + |
| 184 | + template<bool OtherConst> |
| 185 | + requires sentinel_for<sentinel_t<Base>, iterator_t<<i>maybe-const</i><OtherConst, V>>> |
| 186 | + friend constexpr bool operator==(const <i>iterator</i><OtherConst>& x, const <i>sentinel</i>& y); |
| 187 | + |
| 188 | + template<bool OtherConst> |
| 189 | + requires sized_sentinel_for<sentinel_t<<i>Base</i>>, iterator_t<<i>maybe-const</i><OtherConst, V>>> |
| 190 | + friend constexpr range_difference_t<<i>maybe-const</i><OtherConst, V>> |
| 191 | + operator-(const <i>iterator</i><OtherConst>& x, const <i>sentinel</i>& y); |
| 192 | + |
| 193 | + template<bool OtherConst> |
| 194 | + requires sized_sentinel_for<sentinel_t<<i>Base</i>>, iterator_t<<i>maybe-const</i><OtherConst, V>>> |
| 195 | + friend constexpr range_difference_t<<i>maybe-const</i><OtherConst, V>> |
| 196 | + operator-(const <i>sentinel</i>& x, const <i>iterator</i><OtherConst>& y); |
| 197 | + }; |
| 198 | +}</ins> |
| 199 | +</pre> |
| 200 | +</blockquote> |
| 201 | +<pre><ins> |
| 202 | +constexpr explicit <i>sentinel</i>(sentinel_t<<i>Base</i>> end);</ins> |
| 203 | +</pre> |
| 204 | +<blockquote> |
| 205 | +<p> |
| 206 | +<ins>-?- <i>Effects</i>: Initializes <code><i>end_</i></code> with <code>std::move(end)</code>.</ins> |
| 207 | +</p> |
| 208 | +</blockquote> |
| 209 | +<pre><ins> |
| 210 | +constexpr <i>sentinel</i>(<i>sentinel</i><!Const> other) |
| 211 | + requires Const && convertible_to<sentinel_t<V>, sentinel_t<<i>Base</i>>>;</ins> |
| 212 | +</pre> |
| 213 | +<blockquote> |
| 214 | +<p> |
| 215 | +<ins>-?- <i>Effects</i>: Initializes <code><i>end_</i></code> with <code>std::move(other.<i>end_</i>)</code>.</ins> |
| 216 | +</p> |
| 217 | +</blockquote> |
| 218 | +<pre><ins> |
| 219 | +constexpr sentinel_t<Base> base() const;</ins> |
| 220 | +</pre> |
| 221 | +<blockquote> |
| 222 | +<p> |
| 223 | +<ins>-?- <i>Effects</i>: Equivalent to: <code>return <i>end_</i>;</code></ins> |
| 224 | +</p> |
| 225 | +</blockquote> |
| 226 | +<pre><ins> |
| 227 | +template<bool OtherConst> |
| 228 | + requires sentinel_for<sentinel_t<Base>, iterator_t<<i>maybe-const</i><OtherConst, V>>> |
| 229 | +friend constexpr bool operator==(const <i>iterator</i><OtherConst>& x, const <i>sentinel</i>& y);</ins> |
| 230 | +</pre> |
| 231 | +<blockquote> |
| 232 | +<p> |
| 233 | +<ins>-?- <i>Effects</i>: Equivalent to: <code>return x.<i>current_</i> == y.<i>end_</i>;</code></ins> |
| 234 | +</p> |
| 235 | +</blockquote> |
| 236 | +<pre><ins> |
| 237 | +template<bool OtherConst> |
| 238 | + requires sized_sentinel_for<sentinel_t<<i>Base</i>>, iterator_t<<i>maybe-const</i><OtherConst, V>>> |
| 239 | +friend constexpr range_difference_t<<i>maybe-const</i><OtherConst, V>> |
| 240 | + operator-(const <i>iterator</i><OtherConst>& x, const <i>sentinel</i>& y);</ins> |
| 241 | +</pre> |
| 242 | +<blockquote> |
| 243 | +<p> |
| 244 | +<ins>-?5- <i>Effects</i>: Equivalent to: <code>return x.<i>current_</i> - y.<i>end_</i>;</code></ins> |
| 245 | +</p> |
| 246 | +</blockquote> |
| 247 | +<pre><ins> |
| 248 | +template<bool OtherConst> |
| 249 | + requires sized_sentinel_for<sentinel_t<<i>Base</i>>, iterator_t<<i>maybe-const</i><OtherConst, V>>> |
| 250 | +friend constexpr range_difference_t<<i>maybe-const</i><OtherConst, V>> |
| 251 | + operator-(const <i>sentinel</i>& x, const <i>iterator</i><OtherConst>& y);</ins> |
| 252 | +</pre> |
| 253 | +<blockquote> |
| 254 | +<p> |
| 255 | +<ins>-6- <i>Effects</i>: Equivalent to: <code>return x.<i>end_</i> - y.<i>current_</i>;</code></ins> |
| 256 | +</p> |
| 257 | +</blockquote> |
| 258 | +</blockquote> |
| 259 | +</li> |
| 260 | +</ol> |
56 | 261 | </resolution> |
57 | 262 |
|
58 | 263 | </issue> |
0 commit comments