<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[std::function&amp;lt;&amp;gt; und Rvalue-Referenzen]]></title><description><![CDATA[<p>Hallo!<br />
Mit Google konnte ich leider nicht viel außer einen VS-Bug finden, der sich auf das Problem beziehen könnte, es geht um Rvalue-Referenzen in std::function&lt;&gt;-Objeken:</p>
<pre><code class="language-cpp">#include &lt;function&gt;
#include &lt;iostream&gt;

void test(int&amp;&amp; i, char c) {
	std::cout &lt;&lt; i;
}

int main() {
	std::function&lt;void (int&amp;&amp;, char)&gt; f(test);
	auto function = std::bind(f, std::placeholders::_1, 'A');
	function(5);
}
</code></pre>
<p>So rein theoretisch/semantisch müsste das doch eigentlich funktionieren, tut's aber nicht. Irgendwo in den Tiefen der Fehlermeldungen von std::function finde ich:</p>
<pre><code>error C2664: 'void std::tr1::_Function_impl2&lt;_Ret,_Arg0,_Arg1&gt;::operator ()(_Arg0,_Arg1) const': Konvertierung des Parameters 1 von 'int' in 'int &amp;&amp;' nicht möglich
Ein lvalue kann nicht an einen rvalue-Verweis gebunden werden.
</code></pre>
<p>Was ist falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286906/std-function-lt-gt-und-rvalue-referenzen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 17:21:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286906.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 May 2011 14:17:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::function&amp;lt;&amp;gt; und Rvalue-Referenzen on Wed, 18 May 2011 14:17:58 GMT]]></title><description><![CDATA[<p>Hallo!<br />
Mit Google konnte ich leider nicht viel außer einen VS-Bug finden, der sich auf das Problem beziehen könnte, es geht um Rvalue-Referenzen in std::function&lt;&gt;-Objeken:</p>
<pre><code class="language-cpp">#include &lt;function&gt;
#include &lt;iostream&gt;

void test(int&amp;&amp; i, char c) {
	std::cout &lt;&lt; i;
}

int main() {
	std::function&lt;void (int&amp;&amp;, char)&gt; f(test);
	auto function = std::bind(f, std::placeholders::_1, 'A');
	function(5);
}
</code></pre>
<p>So rein theoretisch/semantisch müsste das doch eigentlich funktionieren, tut's aber nicht. Irgendwo in den Tiefen der Fehlermeldungen von std::function finde ich:</p>
<pre><code>error C2664: 'void std::tr1::_Function_impl2&lt;_Ret,_Arg0,_Arg1&gt;::operator ()(_Arg0,_Arg1) const': Konvertierung des Parameters 1 von 'int' in 'int &amp;&amp;' nicht möglich
Ein lvalue kann nicht an einen rvalue-Verweis gebunden werden.
</code></pre>
<p>Was ist falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065277</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Wed, 18 May 2011 14:17:58 GMT</pubDate></item><item><title><![CDATA[Reply to std::function&amp;lt;&amp;gt; und Rvalue-Referenzen on Wed, 18 May 2011 16:27:50 GMT]]></title><description><![CDATA[<p>Scheint so, als ob die Mitarbeiter Microsofts bei der Implementierung von std::function ein paar mal std::forward vergessen haben. Die &quot;rvalue-ness&quot; der 5 müsste eigentlich durchgehend erhalten bleiben. Müsste in diesem konkreten Fall etwa so aussehen (pseudo code):</p>
<pre><code class="language-cpp">class function&lt;void(int&amp;&amp;,char)&gt;
{
  ....
  void operator()(int&amp;&amp; a, char b) const
  {
    return abc_ptr-&gt;invoke(std::forward&lt;int&amp;&amp;&gt;(a), std::forward&lt;char&gt;(b));
  }
  ....
  unspezifizierter-typ *abc_ptr;
};
</code></pre>
<p>wobei über abc_ptr das gewrappte Funktionsobjekt erreichbar ist. So etwas ähnliches müsste dann auch in der invoke-Funktion gemacht werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065321</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065321</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 18 May 2011 16:27:50 GMT</pubDate></item><item><title><![CDATA[Reply to std::function&amp;lt;&amp;gt; und Rvalue-Referenzen on Wed, 18 May 2011 16:52:00 GMT]]></title><description><![CDATA[<p>Das heißt, ich kann function nicht benutzen. Ich brauche es aber (wegen bind). Und Rvalue-Referenzen brauche ich auch, da der Typ definitiv nicht kopierbar sein soll. Was kann ich jetzt machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065348</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Wed, 18 May 2011 16:52:00 GMT</pubDate></item><item><title><![CDATA[Reply to std::function&amp;lt;&amp;gt; und Rvalue-Referenzen on Wed, 18 May 2011 17:20:12 GMT]]></title><description><![CDATA[<p>Das ist der Nachteil wenn man experimentelle Features nutzt. Auf ein Update der Dinkumware-Bibliothek warten wäre wohl die beste Möglichkeit ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065369</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 18 May 2011 17:20:12 GMT</pubDate></item><item><title><![CDATA[Reply to std::function&amp;lt;&amp;gt; und Rvalue-Referenzen on Wed, 18 May 2011 17:23:24 GMT]]></title><description><![CDATA[<p>Und wenn du ja schon C++0x nutzt, könntest du ja auch gerade <code>decltype</code> nutzen:</p>
<pre><code class="language-cpp">void test(int&amp;&amp; i, char c) { 
    std::cout &lt;&lt; i; 
} 

int main() { 
    std::function&lt;decltype(test)&gt; f(test); 
    auto function = std::bind(f, std::placeholders::_1, 'A'); 
    function(5); 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2065372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065372</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 18 May 2011 17:23:24 GMT</pubDate></item><item><title><![CDATA[Reply to std::function&amp;lt;&amp;gt; und Rvalue-Referenzen on Wed, 18 May 2011 17:24:05 GMT]]></title><description><![CDATA[<p>Jodocus schrieb:</p>
<blockquote>
<p>Und Rvalue-Referenzen brauche ich auch, da der Typ definitiv nicht kopierbar sein soll. Was kann ich jetzt machen?</p>
</blockquote>
<p>Wie hättest du es in C++98 gelöst?</p>
<p>Referenzen und <code>swap()</code> sind eine Möglichkeit, Smart-Pointer eine andere. Zeig mal etwas konkreten Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065373</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065373</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 18 May 2011 17:24:05 GMT</pubDate></item><item><title><![CDATA[Reply to std::function&amp;lt;&amp;gt; und Rvalue-Referenzen on Wed, 18 May 2011 20:36:03 GMT]]></title><description><![CDATA[<blockquote>
<p>&gt; Wie hättest du es in C++98 gelöst?</p>
</blockquote>
<p>Die Frage habe ich mir auch gestellt und kam auf Smart-Pointer. Aber ideal finde ich es nicht.</p>
<p>Meine dreckige Idee: ich mache es wie std::auto_ptr. Der Kopierkonstruktor der Resourcenklasse ist private - logisch. Was nun, wenn ich std::function&lt;&gt; in der Klasse als Friend deklariere? Geht das? Darf man das? Denn dann könnte ich den Kopierkonstruktor wie bei auto_ptr move-Eigenschaften geben und auf Rvalue-Referenzen verzichten.</p>
<p>@ EOutofRessources: Was bringt mir decltype() da? Das ist doch unterm Strich der selbe Typ - die selbe Fehlermeldung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065539</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Wed, 18 May 2011 20:36:03 GMT</pubDate></item></channel></rss>