Skip to content

Commit f289ed6

Browse files
committed
Jian An provides wording for LWG 3813
1 parent cf89630 commit f289ed6

File tree

1 file changed

+116
-0
lines changed

1 file changed

+116
-0
lines changed

xml/issue3813.xml

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,125 @@ class types provided by the standard library via <tt>volatile</tt> glvalues are
4040

4141
<note>Kona 2022-11-12; Set priority to 2</note>
4242

43+
<note>2025-03-22; Jiang An comments and provides wording</note>
44+
<p>
45+
The proposed resolution relaxes the `input_iterator` concept (which in turn relaxes stronger iterator concepts)
46+
and extends `iter_const_reference_t` and the exposition only <tt><i>iter-const-rvalue-reference-t</i></tt>
47+
aliases. Another approach can be just relaxing the `indirectly_readable` concept, but its impact may be larger
48+
than expected.
49+
</p>
4350
</discussion>
4451

4552
<resolution>
53+
<p>
54+
This wording is relative to <paper num="N5008"/>.
55+
</p>
56+
57+
<ol>
58+
59+
<li><p>Modify <sref ref="[iterator.synopsis]"/>, header <tt>&lt;iterator&gt;</tt> synopsis, as indicated:</p>
60+
61+
<blockquote>
62+
<pre>
63+
[&hellip;]
64+
<i>// <sref ref="[iterator.concept.input]"/>, concept input_iterator</i>
65+
<ins>template&lt;class I&gt;
66+
concept <i>deref-to-value-t</i> = <i>see below</i>; <i>// freestanding</i>
67+
68+
template&lt;class I&gt;
69+
concept <i>weakly-indirectly-readable</i> = <i>see below</i>; <i>// freestanding</i></ins>
70+
71+
template&lt;class I&gt;
72+
concept input_iterator = <i>see below</i>; <i>// freestanding</i>
73+
74+
[&hellip;]
75+
76+
<i>// <sref ref="[const.iterators.alias]"/>, alias templates</i>
77+
template&lt;<del>indirectly_readable</del><ins><i>weakly-indirectly-readable</i></ins> I&gt;
78+
using iter_const_reference_t = <i>see below</i>;
79+
</pre>
80+
</blockquote>
81+
</li>
82+
83+
<li><p>Modify <sref ref="[iterator.concept.input]"/>, concept <tt>input_iterator</tt> synopsis, as indicated:</p>
84+
85+
<blockquote>
86+
<pre>
87+
<ins>template&lt;class I&gt;
88+
concept <i>deref-to-value-t-impl</i> = <i>// exposition only</i>
89+
same_as&lt;remove_cvref_t&lt;iter_reference_t&lt;I&gt;&gt;, iter_value_t&lt;I&gt;&gt; &amp;&amp;
90+
is_object_v&lt;iter_value_t&lt;I&gt;&gt;;
91+
92+
template&lt;class I&gt;
93+
concept <i>deref-to-value-t</i> = <i>// exposition only</i>
94+
<i>deref-to-value-t-impl</i>&lt;remove_cvref_t&lt;I&gt;&gt;;
95+
96+
template&lt;class I&gt;
97+
concept <i>weakly-indirectly-readable</i> = <i>// exposition only</i>
98+
<i>deref-to-value-t</i>&lt;I&gt; ||
99+
indirectly_readable&lt;I&gt;;</ins>
100+
101+
template&lt;class I&gt;
102+
concept input_iterator =
103+
input_or_output_iterator&lt;I&gt; &amp;&amp;
104+
<del>indirectly_readable</del><ins><i>weakly-indirectly-readable</i></ins>&lt;I&gt; &amp;&amp;
105+
requires { typename <i>ITER_CONCEPT</i>(I); } &amp;&amp;
106+
derived_from&lt;<i>ITER_CONCEPT</i>(I), input_iterator_tag&gt;;
107+
</pre>
108+
</blockquote>
109+
</li>
110+
111+
<li><p>Modify <sref ref="[const.iterators.alias]"/> as indicated:</p>
112+
113+
<blockquote>
114+
<pre>
115+
<ins>template&lt;class T&gt;
116+
using <i>ref-add-const-t</i> = <i>see below</i>;</ins>
117+
</pre>
118+
<blockquote>
119+
<p>
120+
<ins>-?- <i>Result</i>: If <tt>is_lvalue_reference_v&lt;T&gt;</tt> is `true`,
121+
<tt>const remove_reference_t&lt;T&gt;&amp;</tt>. Otherwise, if <tt>is_rvalue_reference_v&lt;T&gt;</tt>
122+
is `true`, <tt>const remove_reference_t&lt;T&gt;&amp;&amp;</tt>. Otherwise, <tt>T</tt>.</ins>
123+
</p>
124+
</blockquote>
125+
<pre>
126+
template&lt;<del>indirectly_readable</del><ins><i>weakly-indirectly-readable</i></ins> It&gt;
127+
using iter_const_reference_t = <ins>see below;</ins>
128+
<del>common_reference_t&lt;const iter_value_t&lt;It&gt;&amp;&amp;, iter_reference_t&lt;It&gt;&gt;;</del>
129+
</pre>
130+
<blockquote>
131+
<p>
132+
<ins>-?- <i>Result</i>: If `It` models <tt><i>deref-to-value-t</i></tt>,
133+
<tt><i>ref-add-const-t</i>&lt;iter_reference_t&lt;It&gt;&gt;</tt>. Otherwise,
134+
<tt>common_reference_t&lt;const iter_value_t&lt;It&gt;&amp;&amp;, iter_reference_t&lt;It&gt;&gt;</tt>.</ins>
135+
</p>
136+
</blockquote>
137+
</blockquote>
138+
139+
<blockquote class="note">
140+
<p>
141+
[<i>Drafting note</i>: The simple <tt><i>deref-to-value-t</i></tt> case should be detected first,
142+
which avoids unnecessary instantiations and IFNDR-ness.]
143+
</p>
144+
</blockquote>
145+
146+
</li>
147+
148+
<li><p>Modify <sref ref="[const.iterators.iterator]"/> as indicated:</p>
149+
150+
<blockquote>
151+
<pre>
152+
[&hellip;]
153+
template&lt;<del>indirectly_readable</del><ins><i>weakly-indirectly-readable</i></ins> I&gt;
154+
using <i>iter-const-rvalue-reference-t</i> = <i>// exposition only</i>
155+
common_reference_t&lt;const iter_value_t&lt;I&gt;&amp;&amp;, iter_rvalue_reference_t&lt;I&gt;&gt;;
156+
[&hellip;]
157+
</pre>
158+
</blockquote>
159+
</li>
160+
161+
</ol>
46162
</resolution>
47163

48164
</issue>

0 commit comments

Comments
 (0)