<?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[Rückgabewert zuweisen]]></title><description><![CDATA[<p>Hallo!</p>
<p>Sagen wir es gibt eine externe Klasse (nicht von mir geschrieben) mit folgender Signatur:</p>
<pre><code>Bar Foo::getBar();
</code></pre>
<p>Welche Art des Aufrufs ist dann besser?</p>
<pre><code>Bar b = foo.getBar(); // 1
const Bar&amp; b2 = foo.getBar(); // 2
</code></pre>
<p>Ich hätte jetzt gesagt Variante 2 ist generell besser, da hier kein CopyCtor aufgerufen wird. Kann man das so sagen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324582/rückgabewert-zuweisen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 00:11:22 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324582.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 23 Mar 2014 11:16:33 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 11:16:33 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Sagen wir es gibt eine externe Klasse (nicht von mir geschrieben) mit folgender Signatur:</p>
<pre><code>Bar Foo::getBar();
</code></pre>
<p>Welche Art des Aufrufs ist dann besser?</p>
<pre><code>Bar b = foo.getBar(); // 1
const Bar&amp; b2 = foo.getBar(); // 2
</code></pre>
<p>Ich hätte jetzt gesagt Variante 2 ist generell besser, da hier kein CopyCtor aufgerufen wird. Kann man das so sagen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390514</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390514</guid><dc:creator><![CDATA[Foorer]]></dc:creator><pubDate>Sun, 23 Mar 2014 11:16:33 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 11:22:59 GMT]]></title><description><![CDATA[<p>Richtig, bei Variante 2 wird kein Copyctor aufgerufen.<br />
Die Zeile wird abgeschlossen, der Speicher für den return-Wert freigegeben, deine Referenz zeigt auf Müll und peng.<br />
Nimm Variante 1, der Compiler ist gut genug zu optimieren (RVO).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390515</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 23 Mar 2014 11:22:59 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 11:42:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich hätte jetzt gesagt Variante 2 ist generell besser, da hier kein CopyCtor aufgerufen wird.</p>
</blockquote>
<p>Was ist besser? In beiden Fällen wird wahrscheinlich kein Kopierkonstruktor aufgerufen, weil in Variante 1 entweder<br />
- ein Move-Konstruktor aufgerufen wird, wenn verfügbar, sonst ein Kopierkonstruktor<br />
- Oder die Temporary, die den Rückgabewert hält, elidiert wird, sodass überhaupt nichts gemoved oder kopiert wird. Das bezeichnet man als <em>copy elision</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390517</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390517</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 23 Mar 2014 11:42:33 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 14:05:45 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Die Zeile wird abgeschlossen, der Speicher für den return-Wert freigegeben, deine Referenz zeigt auf Müll und peng.</p>
</blockquote>
<p>Das ist btw nicht der Fall, die Temporary wird durch const-refs am Leben gehalten. Aber die Argumente für Variante 1 stimmen natürlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390563</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 23 Mar 2014 14:05:45 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 14:10:28 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Die Zeile wird abgeschlossen, der Speicher für den return-Wert freigegeben, deine Referenz zeigt auf Müll und peng.</p>
</blockquote>
<p>Das ist btw nicht der Fall, die Temporary wird durch const-refs am Leben gehalten. Aber die Argumente für Variante 1 stimmen natürlich.</p>
</blockquote>
<p>Was die Lifetimerverlängerungsregel gilt auch für Funktionsrückgabewerte? Hätt ich nicht gedacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390564</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 23 Mar 2014 14:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 14:13:24 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Was die Lifetimerverlängerungsregel gilt auch für Funktionsrückgabewerte? Hätt ich nicht gedacht.</p>
</blockquote>
<p>Es ist völlig egal, woher der Initializer kommt. Wichtig ist nur seine Wertkategorie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390565</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 23 Mar 2014 14:13:24 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 14:21:42 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Was die Lifetimerverlängerungsregel gilt auch für Funktionsrückgabewerte? Hätt ich nicht gedacht.</p>
</blockquote>
<p>Es ist völlig egal, woher der Initializer kommt. Wichtig ist nur seine Wertkategorie.</p>
</blockquote>
<p>Nein, ich dachte nur, dass der Rückgabewertspeicher irgendwie was Spezielles ist und das deshalb nicht greift. Wieso gibt es die Regel überhaupt? Nutzt man die irgendwann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390567</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390567</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 23 Mar 2014 14:21:42 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 14:30:28 GMT]]></title><description><![CDATA[<p>Ok, dadurch dass die Referenz const ist, wird also das temporäre Rückgabeobjekt am Leben gehalten? Gilt das auch für non-const Referenzen?</p>
<pre><code>const
const Bar&amp; b = foo.getBar();
Bar&amp; b2 = foo.getBar();
</code></pre>
<p>Das Temp Objekt bleibt also am Leben solange b besteht? Wie ist das mit b2?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390571</guid><dc:creator><![CDATA[Foorer]]></dc:creator><pubDate>Sun, 23 Mar 2014 14:30:28 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 14:35:48 GMT]]></title><description><![CDATA[<p>Compile-Error. Eine LValue Referenz bindet nicht an RValues (Temporaries). Mit einer RValue Referenz wuerde das klappen. Fuer const-Lvalue-Ref gibts eine Ausnahmeregelung, darum ist das erlaubt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390572</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Sun, 23 Mar 2014 14:35:48 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 14:43:02 GMT]]></title><description><![CDATA[<blockquote>
<p>Wieso gibt es die Regel überhaupt? Nutzt man die irgendwann?</p>
</blockquote>
<p>Welche Regel? Dass man Temporaries an Const-Lvalue-Referenzen binden kann? Das ist eine allgemeine Regel.</p>
<blockquote>
<p>Otherwise, the reference shall be an <strong>lvalue reference to a non-volatile const type</strong> [...], or the reference shall be an <strong>rvalue reference</strong>.<br />
- If the initializer expression is an xvalue (but not a bit-field), class prvalue, array prvalue or function lvalue and <em>“cv1 T1”</em> is reference-compatible with <em>“cv2 T2”</em><br />
[...]<br />
then the reference is bound to the value of the initializer expression [...] (or [...] to an appropriate base class subobject).<br />
- Otherwise, a temporary of type <em>“ cv1 T1”</em> is created and initialized from the initializer expression using the rules for a non-reference copy-initialization (8.5).<br />
The reference is then bound to the temporary.</p>
</blockquote>
<p>Der Unterschied zwischen Klassen und bspw. Skalaren ist folgender</p>
<pre><code>A const&amp; a = A(); // Wenn A eine Klasse ist, dann wird a an den Initializer gebunden
int const&amp; b = 4; // Es wird eine Temporary erstellt, b wird an diese gebunden
</code></pre>
<blockquote>
<p>Gilt das auch für non-const Referenzen?</p>
</blockquote>
<p><strong>Nein.</strong></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390573</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 23 Mar 2014 14:43:02 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 14:52:10 GMT]]></title><description><![CDATA[<blockquote>
<p>Eine LValue Referenz bindet nicht an RValues (Temporaries).</p>
</blockquote>
<p>Ein rvalue muss nicht auf eine Temporary verweisen.<br />
Das hier ist genauso ein Fehler:</p>
<pre><code>int b;
int&amp; a = static_cast&lt;int&amp;&amp;&gt;(b); // static_cast erzeugt keine Temporary, siehe §5.2.9/3
</code></pre>
<blockquote>
<p>Fuer const-Lvalue-Ref gibts eine Ausnahmeregelung, darum ist das erlaubt.</p>
</blockquote>
<p>Es ist dieselbe Regelung für rvalue-Referenzen wie für Const-lvalue-Referenzen (Wie macht man das nun mit der Groß- und Kleinschreibung? :D), siehe Zitat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390577</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sun, 23 Mar 2014 14:52:10 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 14:58:52 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<blockquote>
<p>Wieso gibt es die Regel überhaupt? Nutzt man die irgendwann?</p>
</blockquote>
<p>Welche Regel? Dass man Temporaries an Const-Lvalue-Referenzen binden kann? Das ist eine allgemeine Regel.</p>
</blockquote>
<p>Nein, nicht dass man sie binden kann, sondern dass dann die Lifetime verlängert wird. Welchen Sinn macht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390579</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 23 Mar 2014 14:58:52 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 15:16:00 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Nein, nicht dass man sie binden kann, sondern dass dann die Lifetime verlängert wird. Welchen Sinn macht das?</p>
</blockquote>
<p>Du kannst non-copyables zurückgeben. (C++98)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390580</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 23 Mar 2014 15:16:00 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabewert zuweisen on Sun, 23 Mar 2014 15:20:42 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Nein, nicht dass man sie binden kann, sondern dass dann die Lifetime verlängert wird. Welchen Sinn macht das?</p>
</blockquote>
<p>Du kannst non-copyables zurückgeben. (C++98)</p>
</blockquote>
<p>Und wie gelangen die in den Returnspeicher?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2390583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2390583</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Sun, 23 Mar 2014 15:20:42 GMT</pubDate></item></channel></rss>