<?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[Was macht das neue &amp;amp;&amp;amp;]]></title><description><![CDATA[<p>Hi,</p>
<p>wofür verwendet man das neue &amp;&amp; bzw. wie heißt das? Soweit ich das bisher verstanden habe scheint das was mit ranges zu tun zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/304244/was-macht-das-neue-amp-amp</link><generator>RSS for Node</generator><lastBuildDate>Sun, 09 Aug 2026 21:02:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/304244.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 01 Jun 2012 18:43:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Was macht das neue &amp;amp;&amp;amp; on Fri, 01 Jun 2012 18:43:55 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>wofür verwendet man das neue &amp;&amp; bzw. wie heißt das? Soweit ich das bisher verstanden habe scheint das was mit ranges zu tun zu haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218258</guid><dc:creator><![CDATA[C++11er]]></dc:creator><pubDate>Fri, 01 Jun 2012 18:43:55 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht das neue &amp;amp;&amp;amp; on Fri, 01 Jun 2012 18:53:06 GMT]]></title><description><![CDATA[<p>Das &quot;neue&quot; &amp;&amp; sind RValue References:<br />
<a href="http://thbecker.net/articles/rvalue_references/section_01.html" rel="nofollow">http://thbecker.net/articles/rvalue_references/section_01.html</a></p>
<p>Edit:<br />
Mit Ranges hat das gar nichts zu tun.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218261</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 01 Jun 2012 18:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht das neue &amp;amp;&amp;amp; on Sat, 02 Jun 2012 01:14:54 GMT]]></title><description><![CDATA[<p>Wie hat man das dann zu Verstehen?</p>
<pre><code class="language-cpp">int* getPointerTo(int&amp;&amp; Value) {
	return &amp;Value;
}

int main() {
	int* pToInt= function(5*5);
}
</code></pre>
<p>Kann man pToInt bedenkenlos verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218352</guid><dc:creator><![CDATA[EinUnreg]]></dc:creator><pubDate>Sat, 02 Jun 2012 01:14:54 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht das neue &amp;amp;&amp;amp; on Sat, 02 Jun 2012 01:17:50 GMT]]></title><description><![CDATA[<p>So meinte ich das natürlich:</p>
<pre><code class="language-cpp">int* getPointerTo(int&amp;&amp; Value) {
    return &amp;Value;
}

int main() {
    int* pToInt= getPointerTo(5*5);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2218353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218353</guid><dc:creator><![CDATA[EinUnreg]]></dc:creator><pubDate>Sat, 02 Jun 2012 01:17:50 GMT</pubDate></item><item><title><![CDATA[Reply to Was macht das neue &amp;amp;&amp;amp; on Sat, 02 Jun 2012 07:38:32 GMT]]></title><description><![CDATA[<p>EinUnreg schrieb:</p>
<blockquote>
<p>Kann man pToInt bedenkenlos verwenden?</p>
</blockquote>
<p>Nein. Es bezieht sich auch auf ein nicht mehr existierendes temporäres int-Objekt. Das verhält sich genauso wie bei</p>
<pre><code class="language-cpp">int const* foo(int const&amp; x)
{
  return &amp;x;
}
int main()
{
  int const* p = foo(5*5);
  // p ist ein baumelnder/ungültiger Zeiger
}
</code></pre>
<p>Allerdings darfst du</p>
<pre><code class="language-cpp">int main()
{
  int&amp;&amp; t = 5*5;
}
</code></pre>
<p>genauso wie</p>
<pre><code class="language-cpp">int main()
{
  int const&amp; t = 5*5;
}
</code></pre>
<p>schreiben, da hier in diesen Fällen die Lebenszeit des temporären Objekts verlängert wird und es so lange am leben bleibt, wie es die Referenz gibt.</p>
<p>Mit &amp;&amp; kannst du auch nur Referenzen (Rvalue-Referenzen) erzeugen so ähnlich wie mit &amp; (Lvalue-Referenzen). Allerdings sind die Regeln ein bisschen anders. Solche Referenzen lassen sich immer nur so initialisieren, dass sie sich auf temporäre Objekte oder andere Objekte, für die sich der Nutzer nicht mehr interessiert, beziehen. Man darf also ruhigen Gewissens das Objekt modifizieren, auf das sich eine Rvalue-Referenz bezieht. Das lässt sich prima für eine &quot;Optimierung&quot; von Kopiervorgängen nutzen. Du kannst deiner selbstgeschriebenen Klasse, sofern sinnvoll, neben dem Kopierkonstruktor auch einen sogenannten Movekonstruktor spendieren, der als Parameter eine Rvalue-Referenz auf nicht-const entgegen nimmt: DeineKlasse&amp;&amp;. Da sich diese Referenz ja nur so initialisieren lässt, dass sie sich auf etwas bezieht, was immer verändert werden darf, kannst du theoretisch dem referenzierten Objekt &quot;die Eingeweide&quot; klauen, statt die Eingeweide zu kopieren. Das ist dann sinnvoll, wenn so ein Objekt, logisch gesehen, aus mehreren Teilen besteht und da auch Sachen bei sind, die im Freispeicher alloziert wurden.</p>
<p>Was man auch noch dazu sagen muss, ist, dass es eine besondere Template-Argument-Deduktionsregel gibt, die sich nur auf ein Muster wie T&amp;&amp; bezieht, wobei T vom Compiler bestimmt wird:</p>
<pre><code class="language-cpp">template&lt;class T&gt; void foo(T&amp;&amp; x);

int main()
{
  int i = 5*5;
  foo(5*5); // --&gt; T=int,  T&amp;&amp;=int&amp;&amp;
  foo(i);   // --&gt; T=int&amp;, T&amp;&amp;=int&amp;
}
</code></pre>
<p>Hier ist also x nicht immer eine Rvalue-Referenz sondern ggf auch eine Lvalue-Referenz, falls T ein Lvalue-Referenztyp ist. Du magst hier drüber stolpern, aber es hat seinen Nutzen (siehe &quot;perfect forwarding&quot;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2218368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2218368</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sat, 02 Jun 2012 07:38:32 GMT</pubDate></item></channel></rss>