Skip to content

Commit 8d81089

Browse files
committed
New issue from Tomasz: "Skipping indirection is not allowed for function_ref"
1 parent f523559 commit 8d81089

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed

xml/issue4264.xml

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?xml version='1.0' encoding='utf-8' standalone='no'?>
2+
<!DOCTYPE issue SYSTEM "lwg-issue.dtd">
3+
4+
<issue num="4264" status="New">
5+
<title>Skipping indirection is not allowed for <code>function_ref</code></title>
6+
<section><sref ref="[func.wrap.general]"/></section>
7+
<submitter>Tomasz Kami&nacute;ski</submitter>
8+
<date>15 May 2025</date>
9+
<priority>99</priority>
10+
11+
<discussion>
12+
<p>
13+
Currently the wording in <sref ref="[func.wrap.general]"/> allows implementation
14+
to avoid double indirection when constructing owning functions wrappers from another one:
15+
</p>
16+
<blockquote>
17+
<p>
18+
-2- Let <tt>t</tt> be an object of a type that is a specialization of <tt>function</tt>,
19+
<tt>copyable_function</tt>, or <tt>move_only_function</tt>, such that the target object
20+
<tt>x</tt> of <tt>t</tt> has a type that is a specialization of <tt>function</tt>,
21+
<tt>copyable_function</tt>, or <tt>move_only_function</tt>.
22+
Each argument of the invocation of <tt>x</tt> evaluated as part of the invocation of <tt>t</tt>
23+
may alias an argument in the same position in the invocation of <tt>t</tt> that has the same type,
24+
even if the corresponding parameter is not of reference type.
25+
</p>
26+
</blockquote>
27+
<p>
28+
However, the wording does not cover a <code>function_ref</code>, disallowing implementation to perform
29+
this optimization when signatures are compatible, for example:
30+
</p>
31+
<blockquote><pre>
32+
std::function_ref&lt;void() noexcept&gt; f1(ptr);
33+
std::function_ref&lt;void()&gt; f1(f2);
34+
</pre></blockquote>
35+
<p>
36+
We should include <tt>function_ref</tt> in the list. Note that this allows, but does not require,
37+
an implementation to perform such an optimization. As a consequence, it is acceptable
38+
to specify the allowance for all combinations of polymorphic wrappers, even for creating an
39+
owning wrapper from a non-owning one, where implementing such an optimization may not be possible.
40+
</p>
41+
</discussion>
42+
43+
<resolution>
44+
<p>
45+
This wording is relative to <paper num="N5008"/>.
46+
</p>
47+
<ol>
48+
49+
<li><p>Modify <sref ref="[func.wrap.general]"/> as indicated:</p>
50+
51+
<blockquote>
52+
<p>
53+
-2- Let <tt>t</tt> be an object of a type that is a specialization of <tt>function</tt>,
54+
<tt>copyable_function</tt>, <del>or</del> <tt>move_only_function</tt><ins>, or <tt>function_ref</tt></ins>,
55+
such that the target object <tt>x</tt> of <tt>t</tt> has a type that is a specialization of <tt>function</tt>,
56+
<tt>copyable_function</tt>, <del>or</del><tt>move_only_function</tt><ins>, or <tt>function_ref</tt></ins>.
57+
Each argument of the invocation of <tt>x</tt> evaluated as part of the invocation of <tt>t</tt>
58+
may alias an argument in the same position in the invocation of <tt>t</tt> that has the same type,
59+
even if the corresponding parameter is not of reference type.
60+
</p>
61+
</blockquote>
62+
63+
</li>
64+
</ol>
65+
66+
</resolution>
67+
68+
</issue>

0 commit comments

Comments
 (0)