<?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[Wie geht Compiler mit r-values um]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>ich frage mich seit längerem, wie der Compiler intern eigentlich mit r-value Referenzen umgeht. Betrachtet man Beispielsweise folgendes:</p>
<pre><code class="language-cpp">int&amp; foo()
{
  int&amp;&amp; x = 5 + 4;
  return x;
}

int main()
{
  std::cout &lt;&lt; foo() &lt;&lt; std::endl;

  return 0;
}
</code></pre>
<p>Es wird in der Funktion &quot;foo&quot; 5+4 temporär auf dem Stack (und zwar dem Stack-Frame der Funktion &quot;foo&quot;) erzeugt und x ist anschließende eine Referenz auf diesen temporären Wert (was das Ganze zu einem l-value macht).<br />
Nun gibt foo() eine Referenz auf x und somit auf den ursprünglich temporären Wert, der immer noch in dem Stack-Frame von &quot;foo&quot; liegen müsste zurück, welche eigentlich ungültig werden müsste, da &quot;foo&quot; abgearbeitet ist oder?</p>
<p>Was genau macht der Compiler dann hier? Kopiert er den temporären Wert intern irgendwie in den Heap oder einen anderen nicht-lokalen Speicher?</p>
<p>Insbesondere ist ja Beispielsweise so etwas wie</p>
<pre><code class="language-cpp">int&amp; foo()
{
  int y = 5 + 4;
  return y;
}

int main()
{
  std::cout &lt;&lt; foo() &lt;&lt; std::endl;

  return 0;
}
</code></pre>
<p>vom Compiler nicht erlaubt, da &quot;y&quot; lokal in &quot;foo&quot; ist, d.h. genau wie der temporäre Wert um dem es in dem Beispiel vorher ging, liegt y auf dem Stack-Frame von &quot;foo&quot;.</p>
<p>Weiß hier jemand wie das in etwas abläuft?</p>
<p>Viele Grüße <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/302374/wie-geht-compiler-mit-r-values-um</link><generator>RSS for Node</generator><lastBuildDate>Tue, 11 Aug 2026 08:29:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/302374.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Apr 2012 13:25:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 13:25:25 GMT]]></title><description><![CDATA[<p>Hey Leute,</p>
<p>ich frage mich seit längerem, wie der Compiler intern eigentlich mit r-value Referenzen umgeht. Betrachtet man Beispielsweise folgendes:</p>
<pre><code class="language-cpp">int&amp; foo()
{
  int&amp;&amp; x = 5 + 4;
  return x;
}

int main()
{
  std::cout &lt;&lt; foo() &lt;&lt; std::endl;

  return 0;
}
</code></pre>
<p>Es wird in der Funktion &quot;foo&quot; 5+4 temporär auf dem Stack (und zwar dem Stack-Frame der Funktion &quot;foo&quot;) erzeugt und x ist anschließende eine Referenz auf diesen temporären Wert (was das Ganze zu einem l-value macht).<br />
Nun gibt foo() eine Referenz auf x und somit auf den ursprünglich temporären Wert, der immer noch in dem Stack-Frame von &quot;foo&quot; liegen müsste zurück, welche eigentlich ungültig werden müsste, da &quot;foo&quot; abgearbeitet ist oder?</p>
<p>Was genau macht der Compiler dann hier? Kopiert er den temporären Wert intern irgendwie in den Heap oder einen anderen nicht-lokalen Speicher?</p>
<p>Insbesondere ist ja Beispielsweise so etwas wie</p>
<pre><code class="language-cpp">int&amp; foo()
{
  int y = 5 + 4;
  return y;
}

int main()
{
  std::cout &lt;&lt; foo() &lt;&lt; std::endl;

  return 0;
}
</code></pre>
<p>vom Compiler nicht erlaubt, da &quot;y&quot; lokal in &quot;foo&quot; ist, d.h. genau wie der temporäre Wert um dem es in dem Beispiel vorher ging, liegt y auf dem Stack-Frame von &quot;foo&quot;.</p>
<p>Weiß hier jemand wie das in etwas abläuft?</p>
<p>Viele Grüße <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":-)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202887</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Tue, 17 Apr 2012 13:25:25 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 13:39:12 GMT]]></title><description><![CDATA[<p>rvalue Referenzen sind auch nur Referenzen. Beide Beispiele kompilieren, haben aber undefiniertes Verhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202893</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202893</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Tue, 17 Apr 2012 13:39:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 13:52:30 GMT]]></title><description><![CDATA[<p>Hallo MatheStein,</p>
<p>wo hast du das Beipiel her? Selbstkostruiert oder aus einer brauchbaren Quelle?<br />
Also folgende Zeile kommt mir ziemlich dubios vor:</p>
<pre><code class="language-cpp">int&amp;&amp; x = 5 + 4;
</code></pre>
<p>Du sagst ja selbst, landet 5+4 auf dem Stack (angenommen der Compiler optimiert die Addtion nicht weg, was er natürlich macht). Damit kann der Wert 9 auf dem Stack nach dem Semikolon zerstört werden. Somit hast du eine Dangling-Reference.<br />
Das Verhalten ist vermutlich undefiniert.<br />
Ich bin jetzt (noch) nicht der rvalue-Profi und lasse mich gerne eines besseren belehren.</p>
<p>Ich stell mal eine andere Frage:<br />
Machen rvalue-Referenzen bei einfachen Datentypen überhaupt Sinn?<br />
EDIT: Also ich meine welche die explizit einen einfachen Datentyp angeben und nicht als Template-Typ einen erhalten.</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202898</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Tue, 17 Apr 2012 13:52:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 13:58:00 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/25760">@cooky451</a></p>
<p>Hast recht, der schmeißt &quot;nur&quot; ne Warning, aber dann ist bei mir schon Ende ^^</p>
<p>Dann weiß ich bescheid, dachte schon der kopiert sich da irgendwas zu recht, vielen Dank euch beiden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202903</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Tue, 17 Apr 2012 13:58:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 13:58:27 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Also folgende Zeile kommt mir ziemlich dubios vor:</p>
<pre><code class="language-cpp">int&amp;&amp; x = 5 + 4;
</code></pre>
<p>Du sagst ja selbst, landet 5+4 auf dem Stack (angenommen der Compiler optimiert die Addtion nicht weg, was er natürlich macht). Damit kann der Wert 9 auf dem Stack nach dem Semikolon zerstört werden. Somit hast du eine Dangling-Reference.<br />
Das Verhalten ist vermutlich undefiniert.<br />
Ich bin jetzt (noch) nicht der rvalue-Profi und lasse mich gerne eines besseren belehren.</p>
</blockquote>
<p>Ich habe zwar den Standard nicht gelesen, aber so etwas Einfaches wird wohl kaum undefiniertes Verhalten sein. Dann könnte man ja besser die Syntax verbieten.</p>
<pre><code class="language-cpp">//darf man ja auch:
const int &amp;x = 5 + 4;
</code></pre>
<p>XSpille schrieb:</p>
<blockquote>
<p>Ich stell mal eine andere Frage:<br />
Machen rvalue-Referenzen bei einfachen Datentypen überhaupt Sinn?</p>
</blockquote>
<p>Nein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202904</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 17 Apr 2012 13:58:27 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 14:13:03 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<pre><code class="language-cpp">//darf man ja auch:
const int &amp;x = 5 + 4;
</code></pre>
</blockquote>
<p>Das ist wirklich standardkonformes C++? Ich hätte das intuitiv auch als undefiniert abgestempelt...</p>
<p>Man lernt nie aus <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Aber wie kann das verwirklicht werden? Die 9 liegt doch irgendwo auf dem Stack, oder? Und man hat ja keinen Anhaltspunkt, wann sie zerstörrt werden darf.</p>
<p>Gruß,<br />
XSpille</p>
<p>EDIT: Das kann doch eigentlich nur gehen, wenn das Ergebnis zur Kompilierzeit bekannt ist. Und somit optimiert der Compiler doch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202913</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202913</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Tue, 17 Apr 2012 14:13:03 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 14:13:43 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Also folgende Zeile kommt mir ziemlich dubios vor:</p>
<pre><code class="language-cpp">int&amp;&amp; x = 5 + 4;
</code></pre>
<p>Du sagst ja selbst, landet 5+4 auf dem Stack (angenommen der Compiler optimiert die Addtion nicht weg, was er natürlich macht). Damit kann der Wert 9 auf dem Stack nach dem Semikolon zerstört werden. Somit hast du eine Dangling-Reference.</p>
</blockquote>
<p>Nö, die Lebenszeit des temporären Objekts verlängert sich auf die der Referenz.</p>
<p>Zumindest lese ich das aus 12.2p5 heraus.</p>
<p>Und wenn ich das richtig verstanden habe, ist der <em>einzige</em> Unterschied zwischen lvalue- und rvalue-Referenzen, das letztere (auch) an rvalues gebunden werden können.</p>
<p>Das heißt die obige Initialisierung bindet eine rvalue-Referenz an ein temporäres int-Objekt mit dem Wert 9. Die rvalue-Referenz selbst stellt aber ein lvalue dar (?), weshalb man eine lvalue-Referenz im return-Statement von foo daran binden kann. Beim Beenden der Funktion wird das temporäre Objekt zerstört, und <em>dann</em> haben wir eine dangling reference.</p>
<p>Korrigiert mich, wenn ich falsch liege. Irgendjemand sollte mal einen schönen FAQ-Artikel dazu schreiben.</p>
<p>edit:</p>
<blockquote>
<p>Aber wie kann das verwirklicht werden? Die 9 liegt doch irgendwo auf dem Stack, oder? Und man hat ja keinen Anhaltspunkt, wann sie zerstörrt werden darf.</p>
</blockquote>
<p>Die 9 ist IMHO erstmal gar kein Objekt, sondern einfach ein Wert (ein prvalue). Es wird extra für die Referenz ein temporäres Objekt angelegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202914</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 17 Apr 2012 14:13:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 14:18:41 GMT]]></title><description><![CDATA[<p>DANKE TyRoXx, DANKE Bashar</p>
<p>Bashar schrieb:</p>
<blockquote>
<p>Nö, die Lebenszeit des temporären Objekts verlängert sich auf die der Referenz.</p>
</blockquote>
<p>Wußte ich auch noch nicht...</p>
<p>Macht Sinn... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202916</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Tue, 17 Apr 2012 14:18:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 14:26:08 GMT]]></title><description><![CDATA[<p>Nur bei konstanten Referenzen wird die Lebenszeit verlängert: <a href="http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/" rel="nofollow">http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202923</guid><dc:creator><![CDATA[Oberon_0]]></dc:creator><pubDate>Tue, 17 Apr 2012 14:26:08 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 14:26:33 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Die rvalue-Referenz selbst stellt aber ein lvalue dar (?)</p>
</blockquote>
<p>Die Referenz selbst nicht, ein Ausdruck, in dem sie erscheint, dagegen schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202924</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 17 Apr 2012 14:26:33 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 14:28:17 GMT]]></title><description><![CDATA[<p>Oberon_0 schrieb:</p>
<blockquote>
<p>Nur bei konstanten Referenzen wird die Lebenszeit verlängert: <a href="http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/" rel="nofollow">http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/</a></p>
</blockquote>
<p>Der Artikel ist schon ziemlich alt und berücksichtigt rvalue-Referenzen nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202925</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 17 Apr 2012 14:28:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 14:29:28 GMT]]></title><description><![CDATA[<p>Oberon_0 schrieb:</p>
<blockquote>
<p>Nur bei konstanten Referenzen wird die Lebenszeit verlängert: <a href="http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/" rel="nofollow">http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/</a></p>
</blockquote>
<p>Das ist zu einer Zeit geschrieben worden, als rvalue-Referenzen lediglich als Entwurf existierten. Und C++03 sind Referenzen auf const nun mal die einzigen Weg (mit einer winzigen Ausnahme), die an temporäre Objekte binden können.</p>
<p>Jedenfalls verweist 12.2/5 nicht auf irgendeine bestimmte Art von Referenz. Wenn sie überhaupt an das Argument gebunden werden kann, dann verlängert sich die Lebenszeit des Objektes wie dort beschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202926</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202926</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 17 Apr 2012 14:29:28 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 14:38:11 GMT]]></title><description><![CDATA[<p>Bin jezt etwas verwirrt, wenn man so etwas hat</p>
<pre><code class="language-cpp">const int&amp; foo()
{
  const int &amp;x = 5 + 4;

  return x;
}

int main()
{

  const int&amp; a = foo();

  return 0;
}
</code></pre>
<p>Dann ist doch das a eine dangling Reference oder?</p>
<p>Gruß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202931</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Tue, 17 Apr 2012 14:38:11 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 14:37:00 GMT]]></title><description><![CDATA[<p>MatheStein schrieb:</p>
<blockquote>
<p>Bin jezt etwas verwirrt, wenn man so etwas hat</p>
<pre><code class="language-cpp">int&amp; foo()
{
  const int &amp;x = 5 + 4;
  
  return x;
}

int main()
{
  
  int&amp; a = foo();

  return 0;
}
</code></pre>
<p>Dann ist doch das a eine dangling Reference oder?</p>
<p>Gruß <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Wenn du aus dem int&amp; ein const int&amp; machst, ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202932</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 17 Apr 2012 14:37:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wie geht Compiler mit r-values um on Tue, 17 Apr 2012 14:38:36 GMT]]></title><description><![CDATA[<p>Ups, habs schon verbesser ^^ Vielen Dank <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2202934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2202934</guid><dc:creator><![CDATA[MatheStein]]></dc:creator><pubDate>Tue, 17 Apr 2012 14:38:36 GMT</pubDate></item></channel></rss>