Skip to content

Commit 4cced70

Browse files
committed
New issue from Hewill: "stride_view::iterator should provide operator->"
1 parent 083b8ff commit 4cced70

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

xml/issue4254.xml

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<?xml version='1.0' encoding='utf-8' standalone='no'?>
2+
<!DOCTYPE issue SYSTEM "lwg-issue.dtd">
3+
4+
<issue num="4254" status="New">
5+
<title><code>stride_view::<i>iterator</i></code> should provide <code>operator-&gt;</code></title>
6+
<section><sref ref="[range.stride.iterator]"/></section>
7+
<submitter>Hewill Kang</submitter>
8+
<date>01 May 2025</date>
9+
<priority>99</priority>
10+
11+
<discussion>
12+
<p>
13+
Currently, only <code>filter_view::<i>iterator</i></code> and <code>join_view::<i>InnerIter</i></code> in
14+
<code>&lt;ranges&gt;</code> provide <code>operator-&gt;</code>, which makes sense since their `operator*`
15+
simply dereferences the underlying iterator.
16+
<p/>
17+
It turns out this is also true for <code>stride_view::<i>iterator</i></code>, suggesting that providing
18+
<code>operator-&gt;</code> does is the intuitive thing to do, e.g. when wrapping pointers, keeping
19+
<code>operator-&gt;</code> valid so that users can continue to use <code>it-&gt;foo()</code>.
20+
<p/>
21+
There is no reason to give up this convenience because <code>stride_view::<i>iterator</i></code> is intended
22+
to preserve the nature of the underlying iterator.
23+
</p>
24+
</discussion>
25+
26+
<resolution>
27+
<p>
28+
This wording is relative to <paper num="N5008"/>.
29+
</p>
30+
<ol>
31+
32+
<li><p>Modify <sref ref="[range.stride.iterator]"/> as indicated:</p>
33+
34+
<blockquote>
35+
<pre>
36+
namespace std::ranges {
37+
template&lt;input_range V&gt;
38+
requires view&lt;V&gt;
39+
template&lt;bool Const&gt;
40+
class stride_view&lt;V&gt;::<i>iterator</i> {
41+
using <i>Parent</i> = <i>maybe-const</i>&lt;Const, stride_view&gt;; // <i>exposition only</i>
42+
using <i>Base</i> = <i>maybe-const</i>&lt;Const, V&gt;; // <i>exposition only</i>
43+
44+
iterator_t&lt;<i>Base</i>&gt; <i>current_</i> = iterator_t&lt;<i>Base</i>&gt;(); // <i>exposition only</i>
45+
sentinel_t&lt;<i>Base</i>&gt; <i>end_</i> = sentinel_t&lt;<i>Base</i>&gt;(); // <i>exposition only</i>
46+
range_difference_t&lt;<i>Base</i>&gt; <i>stride_</i> = 0; // <i>exposition only</i>
47+
range_difference_t&lt;<i>Base</i>&gt; <i>missing_</i> = 0; // <i>exposition only</i>
48+
49+
constexpr iterator(<i>Parent</i>* parent, iterator_t&lt;<i>Base</i>&gt; current, // <i>exposition only</i>
50+
range_difference_t&lt;<i>Base</i>&gt; missing = 0);
51+
public:
52+
[&hellip;]
53+
54+
constexpr decltype(auto) operator*() const { return *<i>current_</i>; }
55+
<ins>constexpr auto operator-&gt;() const
56+
requires <i>has-arrow</i>&lt;iterator_t&lt;<i>Base</i>&gt;&gt; &amp;&amp; copyable&lt;iterator_t&lt;<i>Base</i>&gt;&gt;
57+
{ return <i>current_</i>; }</ins>
58+
59+
[&hellip;]
60+
};
61+
}</pre>
62+
</blockquote>
63+
</li>
64+
</ol>
65+
</resolution>
66+
67+
</issue>

0 commit comments

Comments
 (0)