<?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[C++0x: Rvalue Reference für Rückgabe benutzen?]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>Vielleicht kommt meine heutige Frage ein oder zwei Jahre zu früh, aber ich versuche seit einiger Zeit, ein wenig fit zu werden mit dem letzten Draft von C++0x. Darum habe ich nun eine Frage zu Rvalue References, wobei eine Klasse der folgenden Art gegeben sei:</p>
<pre><code class="language-cpp">template&lt;typename ...&gt;
class enumerable : public virtual ...
{
public:
    virtual handle&lt;enumerator&lt;...&gt; &gt; get_enumerator() const = 0;
};
</code></pre>
<p>Jeder Aufruf von <code>get_enumerator</code> erzeugt ein neues <code>enumerator</code> -Objekt, welches mit diesen <code>handle</code> s verwaltet wird. Ein Konstruktor-Aufruf für ein <code>handle</code> ist wenn möglich zu vermeiden.</p>
<p>Ist das der typische Fall, für den Rvalue References gedacht sind? Ich werde leider noch nicht wirklich schlau aus den Erklärungen, die mir zur Verfügung stehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/275587/c-0x-rvalue-reference-für-rückgabe-benutzen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 16:19:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275587.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 17 Oct 2010 16:57:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to C++0x: Rvalue Reference für Rückgabe benutzen? on Sun, 17 Oct 2010 19:44:45 GMT]]></title><description><![CDATA[<p>Guten Abend,</p>
<p>Vielleicht kommt meine heutige Frage ein oder zwei Jahre zu früh, aber ich versuche seit einiger Zeit, ein wenig fit zu werden mit dem letzten Draft von C++0x. Darum habe ich nun eine Frage zu Rvalue References, wobei eine Klasse der folgenden Art gegeben sei:</p>
<pre><code class="language-cpp">template&lt;typename ...&gt;
class enumerable : public virtual ...
{
public:
    virtual handle&lt;enumerator&lt;...&gt; &gt; get_enumerator() const = 0;
};
</code></pre>
<p>Jeder Aufruf von <code>get_enumerator</code> erzeugt ein neues <code>enumerator</code> -Objekt, welches mit diesen <code>handle</code> s verwaltet wird. Ein Konstruktor-Aufruf für ein <code>handle</code> ist wenn möglich zu vermeiden.</p>
<p>Ist das der typische Fall, für den Rvalue References gedacht sind? Ich werde leider noch nicht wirklich schlau aus den Erklärungen, die mir zur Verfügung stehen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966798</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Sun, 17 Oct 2010 19:44:45 GMT</pubDate></item><item><title><![CDATA[Reply to C++0x: Rvalue Reference für Rückgabe benutzen? on Sun, 17 Oct 2010 18:14:38 GMT]]></title><description><![CDATA[<p>Du musst schon konkreter werden.</p>
<p>Prinzipiell ist der Haupteinsatzzweck von Rvalue-Referenzen der &quot;Move-Konstruktor&quot;. Sonst braucht Otto Normalverbraucher die höchst selten. Ich würde sogar soweit gehen und sagen, dass Anfänger Rvalue-Referenzen häufig missbrauchen bzw falsch verstehen. Wenn man da auf der sicheren Seite sein will, vermeidet man sie einfach. Funktionen, die Rvalue-Referenzen zurückgeben sind zu vermeiden. Es gibt im Prinzip nur zwei Funktionen, bei denen das Zurückgeben von Rvalue-Referenzen in Ordnung ist: std::move und std::forward. Alles andere ist höchstwahrscheinlich ein Fehler / Missbrauch.</p>
<p>Ich weiß jetzt nicht, was handle sein soll. Eventuell kannst Du statt &quot;handle&quot; auch einfach std::unique_ptr benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966829</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966829</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 17 Oct 2010 18:14:38 GMT</pubDate></item><item><title><![CDATA[Reply to C++0x: Rvalue Reference für Rückgabe benutzen? on Sun, 17 Oct 2010 19:24:15 GMT]]></title><description><![CDATA[<p>Danke für deine Antwort; ich bin eben gerade ein Anfänger, was Rvalue References betrifft, und überlege mir, wo ich sie einsetzen sollte und wo nicht.</p>
<p>Beim <code>handle</code> handelt es sich um eine Art <code>shared_ptr</code> , welcher sobald er irgendwo konstruiert wird, seine eigene Adresse an zentraler Stelle in einem <code>set</code> abspeichert. Dadurch stehen mir zur Laufzeit diverse Funktionen zur Verfügung, welche für das Projekt zwingend Voraussetzung sind. Jedesmal, wenn ein <code>handle</code> kopiert wird, muss dieses zwingend wieder registriert werden. Umgekehrt wird jedes <code>handle</code> beim Destruktoraufruf wieder abgemeldet.</p>
<p>In <a href="http://www.artima.com/cppsource/rvalue.html" rel="nofollow">A Brief Introduction to Rvalue References</a> steht nun folgendes:</p>
<p>Howard E. Hinnant, Bjarne Stroustrup, and Bronek Kozicki schrieb:</p>
<blockquote>
<p>Rvalue references allow programmers to avoid logically unnecessary copying and to provide perfect forwarding functions. They are primarily meant to aid in the design of higher performance and more robust libraries.</p>
</blockquote>
<p>Betrachtet man den Aufruf <code>get_enumerator</code> , so steht dieser eigentlich für eine Methode folgender Art:</p>
<pre><code class="language-cpp">inline handle&lt;enumerator&lt;...&gt; &gt; enumerable_type&lt;...&gt;::get_enumerator() const
{
    return new (..., ...) type_enumerator&lt;..., ...&gt;(..., ...); // Genauer Inhalt ist hier unwichtig.
}
</code></pre>
<p>Es wird also einfach ein Objekt mit <code>new</code> erzeugt. Dann wird implizit ein <code>handle</code> erzeugt, kopiert, zerstört und dann die Kopie zurückgegeben. Und nachdem der Rückgabewert gespeichert worden ist, wird die Kopie ebenfalls zerstört.</p>
<p>Es scheint gerade nicht zu funktionieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966852</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966852</guid><dc:creator><![CDATA[*rant*]]></dc:creator><pubDate>Sun, 17 Oct 2010 19:24:15 GMT</pubDate></item><item><title><![CDATA[Reply to C++0x: Rvalue Reference für Rückgabe benutzen? on Mon, 18 Oct 2010 02:19:32 GMT]]></title><description><![CDATA[<p>Und wo willst Du jetzt Rvalue-Referenzen einsetzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1966936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1966936</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 18 Oct 2010 02:19:32 GMT</pubDate></item><item><title><![CDATA[Reply to C++0x: Rvalue Reference für Rückgabe benutzen? on Tue, 19 Oct 2010 11:49:45 GMT]]></title><description><![CDATA[<p>/rant/ schrieb:</p>
<blockquote>
<p>In <a href="http://www.artima.com/cppsource/rvalue.html" rel="nofollow">A Brief Introduction to Rvalue References</a> ...</p>
</blockquote>
<p>Das ist übrigens veraltet. Man hat Ende 2008 bzw Anfang 2009 die Rvalue-Referenz-Regeln etwas abgeändert. Beispielsweise soll dies hier</p>
<pre><code class="language-cpp">A a;
A&amp;&amp; a_ref2 = a;
</code></pre>
<p>nicht mehr kompilieren. Das direkte Binden einer Rvalue-Referenz an ein Objekt, auf das sich im Initialisierer ein Lvalue-Ausdruck bezieht, ist nicht mehr erlaubt.</p>
<p>Eine der wenigen Artikel-Serien über Rvalue-Referenzen, welche auf dem aktuellen Stand ist, ist <a href="http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/" rel="nofollow">diese hier</a>.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967479</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 19 Oct 2010 11:49:45 GMT</pubDate></item></channel></rss>