<?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[Wann Out-Parameter als Rückgabewert?]]></title><description><![CDATA[<p>Hallo,</p>
<p>2015 und ich weiß immer noch nicht, wie eine C++11-Funktion mittlerweile aussehen sollte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Wie sieht bei euch eine Funktion aus, die z.B. einen vector&lt;int&gt; zurück gibt?</p>
<p>Bei mir weiterhin</p>
<pre><code>void f(vector&lt;int&gt;&amp; v);
</code></pre>
<p>Nachteilig ist da ja soweit ich sehe nur der unschöne Aufruf.<br />
Bei</p>
<pre><code>vector&lt;int&gt; f();
</code></pre>
<p>ist der Move-Ctor ja nicht völlig umsonst.<br />
Vorteil ist der 'schönere/klarere' Aufruf.<br />
Was ist denn da jetzt recommended? Oder macht man das abhängig davon, wie gut der Rückgabewert 'movable' ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330527/wann-out-parameter-als-rückgabewert</link><generator>RSS for Node</generator><lastBuildDate>Fri, 03 Jul 2026 04:56:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330527.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Jan 2015 14:05:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wann Out-Parameter als Rückgabewert? on Wed, 14 Jan 2015 14:05:21 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>2015 und ich weiß immer noch nicht, wie eine C++11-Funktion mittlerweile aussehen sollte <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Wie sieht bei euch eine Funktion aus, die z.B. einen vector&lt;int&gt; zurück gibt?</p>
<p>Bei mir weiterhin</p>
<pre><code>void f(vector&lt;int&gt;&amp; v);
</code></pre>
<p>Nachteilig ist da ja soweit ich sehe nur der unschöne Aufruf.<br />
Bei</p>
<pre><code>vector&lt;int&gt; f();
</code></pre>
<p>ist der Move-Ctor ja nicht völlig umsonst.<br />
Vorteil ist der 'schönere/klarere' Aufruf.<br />
Was ist denn da jetzt recommended? Oder macht man das abhängig davon, wie gut der Rückgabewert 'movable' ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437546</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Wed, 14 Jan 2015 14:05:21 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Out-Parameter als Rückgabewert? on Wed, 14 Jan 2015 14:18:53 GMT]]></title><description><![CDATA[<p>IMHO sollte eine Funktion Werte per return liefern und Fehler mit Exceptions melden. Weicht sie davon ab, sollte dies gut begründbar sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437551</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437551</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 14 Jan 2015 14:18:53 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Out-Parameter als Rückgabewert? on Wed, 14 Jan 2015 15:03:47 GMT]]></title><description><![CDATA[<p>Wenn du f(vec) verwendest, dann bedeutet das dass du einen vector hast der bereits befüllt ist und du inplace darauf arbeitest. (zB sort)</p>
<p>Wenn du vec=f() verwendest, dann bedeutet das dass du keinen vector hast und f dir einen erstellt. (zB split)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437555</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437555</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 14 Jan 2015 15:03:47 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Out-Parameter als Rückgabewert? on Wed, 14 Jan 2015 15:16:12 GMT]]></title><description><![CDATA[<p>Jockelx schrieb:</p>
<blockquote>
<p>Hallo,<br />
Nachteilig ist da ja soweit ich sehe nur der unschöne Aufruf.</p>
</blockquote>
<p>Du kannst den Rückgabewert nicht als Ausdruck verwenden, um damit z.B. Konstanten zu initialisieren:</p>
<pre><code>const std::vector&lt; int &gt; hausnummern = f();
</code></pre>
<p>Du must dem Kind einen Namen geben, obwohl Du den Namen gar nicht weiter verwende willst:</p>
<pre><code>std::vector&lt; int &gt; temp; // mir fällt kein besserer Name ein :-(
f(temp);

calc( temp );
</code></pre>
<p>vs.</p>
<pre><code>calc( f() );
</code></pre>
<p>Solange mir kein profiler sagt, dass ich es anders machen sollte, würde ich immer erst einmal auf die Lesbarkeit achten. Und meiner Meinung nach ist die</p>
<pre><code>vector&lt;int&gt; f();
</code></pre>
<p>-Variante die besser lesbare.</p>
<p>mfg Torsten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437556</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Wed, 14 Jan 2015 15:16:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Out-Parameter als Rückgabewert? on Wed, 14 Jan 2015 15:55:49 GMT]]></title><description><![CDATA[<p>Ja, das macht alles Sinn.<br />
Das reicht mir auch schon.</p>
<p>Dankeschön!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437561</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Wed, 14 Jan 2015 15:55:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Out-Parameter als Rückgabewert? on Wed, 14 Jan 2015 18:27:39 GMT]]></title><description><![CDATA[<p>Es gibt auch noch diese Variante, wenn es nicht wirklich um <code>vector</code> geht, sondern um eine Folge:</p>
<pre><code class="language-cpp">template &lt;class OutputIterator&gt;
void f(OutputIterator results);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2437582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437582</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 14 Jan 2015 18:27:39 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Out-Parameter als Rückgabewert? on Fri, 16 Jan 2015 15:28:16 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Es gibt auch noch diese Variante, wenn es nicht wirklich um <code>vector</code> geht, sondern um eine Folge:</p>
<pre><code class="language-cpp">template &lt;class OutputIterator&gt;
void f(OutputIterator results);
</code></pre>
</blockquote>
<p>Das ist ja so kaputt und es sagt keiner was? <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>Wenn irgendwo &quot;Iterator&quot; steht, dann erwartet man da auch einen Iterator drin vor zu finden.<br />
Was aber bei der Signatur überhaupt keinen Sinn ergibt. Zum einen kann der Iterator kein out parameter sein, da er ja per value übergeben wird. Also müsste man da einen Iterator rein geben,<br />
auf den geschrieben werden kann.</p>
<pre><code>std::vector&lt;int&gt; data(42);
f(data.begin());
</code></pre>
<p>Da fällt aber sofort auf, dass Iteratoren immer paarweise auftreten. Der Caller müsste also wissen,<br />
wieviele results es den geben kann und entsprechend viel Speicher bereitstellen. Sonst passiert sowas:</p>
<pre><code>void f(OutputIterator results){
  for(size_t i=0; i&lt;100; i++, results++) *results = i;
}

std::vector&lt;int&gt; data(42);
f(data.begin());
</code></pre>
<p>Angenommen, man ändert die Signatur auf eine <code>OutputIterator&amp;</code> , dann könnte man zwar auf eine<br />
in f() lokale oder gar globale Variable einen Iterator zurückgeben. Dann hat man weiterhin das Problem, dass man keinen zweiten Iterator hat und man so über das Ende hinaus lesen oder schreiben könnte. Dazu kommt dann noch, dass der Caller den richtigen Datentyp kennen muss.</p>
<p>Für praktisch alle Fälle ist ein return-by-value zu bevorzugen. Für alle STL Container hat man im schlimmsten Fall ein move. Viel wahrscheinlicher ist allerdings, dass der Compiler eine copy elision macht. Dann kostet eine Übergabe per &quot;output&quot;-Referenz sogar mehr! Davon abgesehen ist beim befüllen von Containern im allgemeinen nicht die Übergabe hinterher der Flaschenhals, sondern das Allokieren des Speichers und das Füllen des Containers selbst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437904</guid><dc:creator><![CDATA[oh, diese schmerzen]]></dc:creator><pubDate>Fri, 16 Jan 2015 15:28:16 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Out-Parameter als Rückgabewert? on Fri, 16 Jan 2015 15:37:16 GMT]]></title><description><![CDATA[<p>oh, diese schmerzen schrieb:</p>
<blockquote>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>Es gibt auch noch diese Variante, wenn es nicht wirklich um <code>vector</code> geht, sondern um eine Folge:</p>
<pre><code class="language-cpp">template &lt;class OutputIterator&gt;
void f(OutputIterator results);
</code></pre>
</blockquote>
<p>Das ist ja so kaputt und es sagt keiner was? <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>
</blockquote>
<p>Das ist überhaupt nicht kaputt. Man verwendet das Konzept einfach nur nicht so, wie du dir das vorstellst.<br />
Man möchte an der Stelle so etwas wie einen <a href="http://en.cppreference.com/w/cpp/iterator/back_insert_iterator" rel="nofollow">std::back_insert_iterator</a> übergeben.</p>
<pre><code class="language-cpp">std::vector&lt;int&gt; results;
f(std::back_inserter(results));
</code></pre>
<p>Das funktioniert auch mit anderen Containern, <a href="http://en.cppreference.com/w/cpp/iterator/ostreambuf_iterator" rel="nofollow">ostreambuf_iterator</a> und so weiter.<br />
Außerdem behält man die Kontrolle über Speicheranforderungen. Damit muss <code>f</code> nichts zu tun haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437906</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437906</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Fri, 16 Jan 2015 15:37:16 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Out-Parameter als Rückgabewert? on Fri, 16 Jan 2015 16:03:48 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Wenn du f(vec) verwendest, dann bedeutet das dass du einen vector hast der bereits befüllt ist und du inplace darauf arbeitest. (zB sort)</p>
<p>Wenn du vec=f() verwendest, dann bedeutet das dass du keinen vector hast und f dir einen erstellt. (zB split)</p>
</blockquote>
<p>Manchmal kann auch eine wirklich gute Erklärung so einfach sein <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/2437909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437909</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 16 Jan 2015 16:03:48 GMT</pubDate></item><item><title><![CDATA[Reply to Wann Out-Parameter als Rückgabewert? on Fri, 16 Jan 2015 16:08:14 GMT]]></title><description><![CDATA[<p>oh, diese schmerzen schrieb:</p>
<blockquote>
<p>TyRoXx schrieb:</p>
<blockquote>
<p>Es gibt auch noch diese Variante, wenn es nicht wirklich um <code>vector</code> geht, sondern um eine Folge:</p>
<pre><code class="language-cpp">template &lt;class OutputIterator&gt;
void f(OutputIterator results);
</code></pre>
</blockquote>
<p>Das ist ja so kaputt und es sagt keiner was? <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>
</blockquote>
<p>Wie TyRoXx schon selbst geschrieben hat ist das gar nicht kaputt. Es ist ganz im Gegenteil sogar ein ziemlich weit verbreitetes C++ Idiom.</p>
<p>Man kann natürlich Output-Iteratoren ala <code>std::back_inserter()</code> generell in Frage stellen. z.B. weil sie sich kaum performant für extremst simple Dinge wie <code>push_back</code> an einen <code>std::vector&lt;char&gt;</code> oder das Schreiben von Bytes in ein File implementieren lassen.<br />
Ändert aber nix daran dass es wie gesagt ein weit verbreitetes C++ Idiom ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2437910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2437910</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 16 Jan 2015 16:08:14 GMT</pubDate></item></channel></rss>