<?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[unique_ptr Funktionsargument]]></title><description><![CDATA[<p>Gibt es einen Unterschied zwischen</p>
<pre><code class="language-cpp">void f(std::unique_ptr&lt;int&gt; u);
</code></pre>
<p>und</p>
<pre><code class="language-cpp">void f(std::unique_ptr&lt;int&gt;&amp;&amp; u)
</code></pre>
<p>?</p>
<p>Welches sollte man verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/319476/unique_ptr-funktionsargument</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Jul 2026 10:10:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/319476.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 20 Aug 2013 16:51:32 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Tue, 20 Aug 2013 16:51:32 GMT]]></title><description><![CDATA[<p>Gibt es einen Unterschied zwischen</p>
<pre><code class="language-cpp">void f(std::unique_ptr&lt;int&gt; u);
</code></pre>
<p>und</p>
<pre><code class="language-cpp">void f(std::unique_ptr&lt;int&gt;&amp;&amp; u)
</code></pre>
<p>?</p>
<p>Welches sollte man verwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347291</guid><dc:creator><![CDATA[unique_ptr übergeben]]></dc:creator><pubDate>Tue, 20 Aug 2013 16:51:32 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Tue, 20 Aug 2013 17:32:15 GMT]]></title><description><![CDATA[<blockquote>
<p>Welches sollte man verwenden?</p>
</blockquote>
<p>Hängt davon ab, wofür du das brauchst. Wobei ich ernsthaft sagen muss, wenn du einfach deine mit <code>new</code> allozierten Objekte RAII-konform und exception-safe verwalten willst, nimm <code>std::shared_ptr</code> für <strong>Funktionsparameter</strong>, und <code>unique_ptr</code> für bspw. <strong>Klassenmember</strong>.</p>
<blockquote>
<p>Gibt es einen Unterschied zwischen [...]</p>
</blockquote>
<p>Nicht viel.</p>
<p>Sehen wir uns mal die möglichen Konstruktoren an, die der Variante 1 verschiedene Aufrufmöglichkeiten geben*:</p>
<pre><code>constexpr unique_ptr (nullptr_t) noexcept : unique_ptr() {}
unique_ptr (pointer p,
    typename conditional&lt;is_reference&lt;D&gt;::value,D,const D&amp;&gt; del) noexcept;	
unique_ptr (pointer p,
    typename remove_reference&lt;D&gt;::type&amp;&amp; del) noexcept;
unique_ptr (unique_ptr&amp;&amp; x) noexcept;
template &lt;class U, class E&gt;
  unique_ptr (unique_ptr&lt;U,E&gt;&amp;&amp; x) noexcept;
template &lt;class U&gt;
  unique_ptr (auto_ptr&lt;U&gt;&amp;&amp; x) noexcept;
</code></pre>
<p>Beispiel (wir nehmen an, nur das erste ist deklariert, das führt sonst zu Ambiguitäten):</p>
<pre><code>f( {new A, {}} ); // (1)
    f( std::unique_ptr&lt;A&gt;{new A} ); // (2)
    f( nullptr ); // (3)
    std::unique_ptr&lt;A&gt; bla{ new A }; // (4)
    f( std::move(bla) ); // (5)
</code></pre>
<p>Aber: Was meinte ich oben mit den Ambiguitäten? Es ist nämlich nun einmal so, dass alle Statements oben auch mit der zweiten Funktionsdeklaration kompilieren! Denn rvalue-Referenzen können genau wie lvalue-to-const-Referenzen initialisiert werden; Es wird dann eine Temporary an sie gebunden (wie auch in Bsp. (2)), das funktioniert immer, wenn der Ausdruck mit dem initialisiert wird zum Zieltyp konvertiert werden kann.<br />
Es gelten, solange andere Möglichkeiten ausfallen, sogar die gleichen semantischen Regeln wie bei (non-reference) <em>copy-initialization</em> (siehe §8.5.3/5)! Das heißt, <strong>von der Semantik beim Funktionsaufruf</strong> sollten beide Varianten gleich sein.</p>
<p>Ob sie sich semantisch komplett gleich verhalten: Nein. Die Typen der Funktionsparameter sind immer noch verschieden (schon rein technisch gesehen). Aber:</p>
<blockquote>
<p>named rvalue references are treated as lvalues</p>
</blockquote>
<p>Das heißt, folgender Code</p>
<pre><code>void f( std::unique_ptr&lt;A&gt;&amp;&amp; ptr ) { std::cout &lt;&lt; &quot;Erste\n&quot;; }
void f( std::unique_ptr&lt;A&gt;&amp; ptr ) { std::cout &lt;&lt; &quot;Zweite\n&quot;; }

int main()
{
    std::unique_ptr&lt;A&gt;&amp;&amp; bla{ new A };
    f( bla );
}
</code></pre>
<p>Würde (auch bei f() statt main() mit bla als Funktionsparameter) bei beiden Parametertypen Zweite ausgeben. Beides in dem Kontext lvalues.</p>
<p>*: Also prinzipiell alle nicht expliziten oder als <code>deleted</code> definierten Konstruktoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347299</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 20 Aug 2013 17:32:15 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Tue, 20 Aug 2013 17:32:14 GMT]]></title><description><![CDATA[<p>Irgendwie hast du mich an der Stelle abgehängt, an der ich der Meinung war, dass in der ersten Deklaration der (nicht vorhandene) Kopierkonstruktor benötigt wird und somit der Unterschied ist, dass die erste Variante schlicht nicht funktioniert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347302</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 20 Aug 2013 17:32:14 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Tue, 20 Aug 2013 17:38:38 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Irgendwie hast du mich an der Stelle abgehängt, an der ich der Meinung war, dass in der ersten Deklaration der (nicht vorhandene) Kopierkonstruktor benötigt wird und somit der Unterschied ist, dass die erste Variante schlicht nicht funktioniert <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p><em>copy-list-initialization</em>, Bashar!</p>
<blockquote>
<p>if T is a class type, constructors are considered. The applicable constructors are enumerated and the best one is chosen through overload resolution (13.3, 13.3.1.7).</p>
</blockquote>
<pre><code>struct B
{
    B(B const&amp;) = delete;

    B( B&amp;&amp; )
    {
        std::cout &lt;&lt; &quot;B(B&amp;&amp;)\n&quot;;
    }

    B( int, char )
    {
        std::cout &lt;&lt; &quot;B(int, char)\n&quot;;
    }
};

int main()
{
    B b = {4, '3'};
}
</code></pre>
<p>Wo wird hier irgendein B-Objekt kopiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347303</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Tue, 20 Aug 2013 17:38:38 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Tue, 20 Aug 2013 17:52:44 GMT]]></title><description><![CDATA[<p>Oh.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347306</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Tue, 20 Aug 2013 17:52:44 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Tue, 20 Aug 2013 21:19:09 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Welches sollte man verwenden?</p>
</blockquote>
<p>Hängt davon ab, wofür du das brauchst. Wobei ich ernsthaft sagen muss, wenn du einfach deine mit <code>new</code> allozierten Objekte RAII-konform und exception-safe verwalten willst, nimm <code>std::shared_ptr</code> für <strong>Funktionsparameter</strong>, und <code>unique_ptr</code> für bspw. <strong>Klassenmember</strong>.</p>
</blockquote>
<p>Blödsinn. Warum sollte man das tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347361</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 20 Aug 2013 21:19:09 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Tue, 20 Aug 2013 21:32:50 GMT]]></title><description><![CDATA[<p>Sone trifft da implizite Annahmen über die use-cases. Zum Beispiel will man nicht, das ein Zeiger auf ein Objekt kopiert wird, obwohl das Objekt hätte kopiert werden sollen. Aber ich halte die use-case annahmen nicht für gerechtfertigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347365</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Tue, 20 Aug 2013 21:32:50 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 05:53:18 GMT]]></title><description><![CDATA[<p>TyRoXx schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>Welches sollte man verwenden?</p>
</blockquote>
<p>Hängt davon ab, wofür du das brauchst. Wobei ich ernsthaft sagen muss, wenn du einfach deine mit <code>new</code> allozierten Objekte RAII-konform und exception-safe verwalten willst, nimm <code>std::shared_ptr</code> für <strong>Funktionsparameter</strong>, und <code>unique_ptr</code> für bspw. <strong>Klassenmember</strong>.</p>
</blockquote>
<p>Blödsinn. Warum sollte man das tun?</p>
</blockquote>
<p><code>shared_ptr</code> ist handy :p . Du kannst einen shared_ptr so übergeben (er ist kopierbar und regelt das definiert). Du hast <code>make_shared</code> - exception-safe.</p>
<p>Natürlich sollte man aber trotzdem standardmäßig <code>unique_ptr</code> verwenden, da hast du völlig Recht, tut mir Leid. <code>shared_ptr</code> impliziert, dass die Besitzverhältnisse unklar sind.</p>
<p>Mir scheint, für <code>unique_ptr</code> gibt es da nur zwei sinnvolle Fälle: Du movest einen alten unique_ptr (Besitz wechselt), oder du erstellst direkt einen neuen (Besitz hat direkt die aufzurufende Funktion). Wie oben gezeigt halt.</p>
<blockquote>
<p>Zum Beispiel will man nicht, das ein Zeiger auf ein Objekt kopiert wird, obwohl das Objekt hätte kopiert werden sollen.</p>
</blockquote>
<p>Das ist was anderes. Wieso überhaupt einen **Smart-**Pointer als Funktionsparameter, wenn diese den Besitz nicht in irgendeiner Weise übernimmt?<br />
Wenn du eine Kopie möchtest, kannst du auch eine Referenz auf ein Objekt im Funktionsparameter nehmen und intern (falls du die Kopie auf dem Heap brauchst) einen Smart-Pointer, natürlich standardmäßig einen <code>unique_ptr</code> , erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347385</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 21 Aug 2013 05:53:18 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 09:45:00 GMT]]></title><description><![CDATA[<p>unique_ptr übergeben schrieb:</p>
<blockquote>
<p>Gibt es einen Unterschied zwischen</p>
<pre><code class="language-cpp">void f(std::unique_ptr&lt;int&gt; u);
</code></pre>
<p>und</p>
<pre><code class="language-cpp">void f(std::unique_ptr&lt;int&gt;&amp;&amp; u)
</code></pre>
<p>?</p>
</blockquote>
<p>Du hast im ersten Fall eine Übergabe &quot;by value&quot;. Das unique_ptr-Objekt lebt da funktionslokal im automatischen Speicher solange bis der Funktionsaufruf abgeschlossen ist.</p>
<p>Im zweiten Fall ist es eine Übergabe &quot;by reference&quot;. Da hat die Funktion nur eine Referenz auf ein unique_ptr-Objekt, was wer weiß wo und wie lange lebt. Typischerweise verweisen Rvalue-Referenzen auf kurzlebige Objekte. Muss aber nicht.</p>
<p>unique_ptr übergeben schrieb:</p>
<blockquote>
<p>Welches sollte man verwenden?</p>
</blockquote>
<p>Mir fällt auf Anhieb kein Anwendungsfall ein, wo es einen deutlichen Unterschied machen würde. Ich könnte mir aber vorstellen, dass viele, die sich dann Deinen Code durchlesen würden, sich darüber wundern, warum du da eine Rvalue-Referenz verwendet hast. std::unique_ptr ist fast so billig &quot;move-bar&quot; wie ein roher Zeiger. Von daher würde ich mir die Indirektion (mit der Rvalue-Referenz) sparen.</p>
<p>Hast du ein praktisches Beispiel parat, wo Du dir unsicher bist, wie der Funktionsparameter am besten zu definieren ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347434</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 21 Aug 2013 09:45:00 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 10:13:19 GMT]]></title><description><![CDATA[<blockquote>
<p>Hängt davon ab, wofür du das brauchst. Wobei ich ernsthaft sagen muss, wenn du einfach deine mit new allozierten Objekte RAII-konform und exception-safe verwalten willst, nimm std::shared_ptr für Funktionsparameter, und unique_ptr für bspw. Klassenmember.</p>
</blockquote>
<p>Bloedsinn. Wenn ich shared-ownership ausdruecken will, dann nehme ich shared_ptr, wenn ich unique-ownership ausdruecken will, dann nehme ich unique_ptr. Wenn ich keine ownership ausdruecken will, dann nehme ich einen rohen Zeiger.</p>
<blockquote>
<p>shared_ptr ist Handy</p>
</blockquote>
<p>Ein dummes Smily macht es nicht besser. Ein Hammer ist auch Handy, doch fuer Schrauben benutze ich dennoch ein anderes Werkzeug.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347440</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 21 Aug 2013 10:13:19 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 10:56:29 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>Das ist was anderes. Wieso überhaupt einen **Smart-**Pointer als Funktionsparameter, wenn diese den Besitz nicht in irgendeiner Weise übernimmt?</p>
</blockquote>
<p>Das war für deine in-klassen-unique-pointer Pauschalaussage, die du völlig ohne Begründung genannt hast. Da will ich dir einmal was gutes tun...naja. Das hab ich davon. Nevermore.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347449</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347449</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Wed, 21 Aug 2013 10:56:29 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 14:47:12 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void f(std::unique_ptr&lt;int&gt; u);
</code></pre>
<p>Geht das überhaupt? Ich dachte man kann von einem unique_ptr keine Kopie machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347533</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347533</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Wed, 21 Aug 2013 14:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 14:50:34 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void f(std::unique_ptr&lt;int&gt; u);
</code></pre>
<p>Geht das überhaupt? Ich dachte man kann von einem unique_ptr keine Kopie machen.</p>
</blockquote>
<p>Exakt meine Frage auf der ersten Seite, auch dort beantwortet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347535</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 21 Aug 2013 14:50:34 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 14:52:05 GMT]]></title><description><![CDATA[<p>Deshalb frage ich, aber ich habe nicht gesehen das jemand direkt darauf geantwortet hätte oder ich verstehe zumindest die Antwort nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347536</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Wed, 21 Aug 2013 14:52:05 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 14:57:17 GMT]]></title><description><![CDATA[<pre><code>void f(std::unique_ptr&lt;int&gt;&amp;&amp; u)
</code></pre>
<p>Eine RValue-Referenz als Funktionsparameter mache ich doch wenn ich Ownership übertragen möchte oder? Also der Aufrufer weiß an der Stelle, dass er das übergebene Objekt nicht weiter benutzen kann oder darf oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347539</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Wed, 21 Aug 2013 14:57:17 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 15:18:39 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>Eine RValue-Referenz als Funktionsparameter mache ich doch wenn ich Ownership übertragen möchte oder?</p>
</blockquote>
<p>Nein, sondern wenn nur RValues als Argumente akzeptiert werden sollen. Typischerweise sind das temporäre Objekte oder Rückgabewerte von <code>std::move()</code> . Am ehesten brauchst du RValue-Referenz-Parameter bei Move-Konstruktor und Move-Zuweisungsoperator (oder wenn du spezifisch optimieren willst, um Moves zu vermeiden). Ansonsten würde ich Pass By Value grundsätzlich vorziehen, da es flexibler ist und in vielen Fällen Codeduplizierung (Überladung für <code>T&amp;&amp;</code> und <code>const T&amp;</code> ) vermeidet.</p>
<p>Wichtig ist zu sehen, dass RValue-Referenz und Move-Semantik verschiedene Konzepte sind. Zwar hängen sie insofern zusammen, als Move-Semantik auf Klassenebene über RValue-Referenzen implementiert wird; doch viele Moves geschehen, ohne dass ein <code>&amp;&amp;</code> in der Funktion oder im Aufruf auftritt.</p>
<p>Die Signatur</p>
<pre><code>void f(std::unique_ptr&lt;int&gt; u);
</code></pre>
<p>drückt bereits aus, dass hier Besitz zur Funktion übertragen wird -- einfach durch die Semantik von <code>unique_ptr</code> , der nur gemoved werden kann. Pass By Value impliziert hier also Besitzübertragung. Diese Signatur verwirrt wahrscheinlich auch weniger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347546</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347546</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 21 Aug 2013 15:18:39 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 15:47:12 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/5202">@otze</a>: Das meintest du! In Ordnung, tut mir Leid. Ja, ich habe falsche Annahmen über die Anforderungen gestellt. Tatsächlich sollte ich solche Pauschalaussagen einfach unterlassen. <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>oder wenn du spezifisch optimieren willst, um Moves zu vermeiden</p>
</blockquote>
<p>*Kopien</p>
<p>Hier wird auch die Falschheit meiner Aussage deutlich. Hätte man einen <code>shared_ptr</code> verwendet, so könnte man bspw. auch einen anderen <code>shared_ptr</code> übergeben - es kann aber nie davon ausgegangen werden, dass der Ownership ganz an die Funktion übergeht. Bei <code>unique_ptr</code> ist das, wie Nexus erklärt hat, impliziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347562</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 21 Aug 2013 15:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 15:56:36 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>oder wenn du spezifisch optimieren willst, um Moves zu vermeiden</p>
</blockquote>
<p>*Kopien</p>
</blockquote>
<p>Nein, ich meinte schon Moves.</p>
<p>Mit RValue-Referenzen hast du bereits eine Referenz auf das Originalobjekt, daher ist der Move unnötig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347563</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347563</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 21 Aug 2013 15:56:36 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 16:06:46 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Sone schrieb:</p>
<blockquote>
<blockquote>
<p>oder wenn du spezifisch optimieren willst, um Moves zu vermeiden</p>
</blockquote>
<p>*Kopien</p>
</blockquote>
<p>Nein, ich meinte schon Moves.</p>
<p>Mit RValue-Referenzen hast du bereits eine Referenz auf das Originalobjekt, daher ist der Move unnötig.</p>
</blockquote>
<p>Ach, du meinst mit Move statt dem Cast zu einer rvalue-Referenz durch <code>std::move</code> den Aufruf eines Move-Konstruktors. Klar, der kann natürlich auch Overhead verursachen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347568</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 21 Aug 2013 16:06:46 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 16:09:25 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Die Signatur</p>
<pre><code>void f(std::unique_ptr&lt;int&gt; u);
</code></pre>
<p>drückt bereits aus, dass hier Besitz zur Funktion übertragen wird -- einfach durch die Semantik von <code>unique_ptr</code> , der nur gemoved werden kann. Pass By Value impliziert hier also Besitzübertragung. Diese Signatur verwirrt wahrscheinlich auch weniger.</p>
</blockquote>
<p>Gerade diese Signatur verwirrt mich extrem. Es war doch genau die Frage, wie man ein Objekt per Value über geben kann, dass nicht kopiert werden kann. Was für einen Sinn macht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347569</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347569</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Wed, 21 Aug 2013 16:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 16:13:25 GMT]]></title><description><![CDATA[<p>TNA schrieb:</p>
<blockquote>
<p>Es war doch genau die Frage, wie man ein Objekt per Value über geben kann, dass nicht kopiert werden kann. Was für einen Sinn macht das?</p>
</blockquote>
<p>Das Verständnis &quot;Pass By Value == Kopie&quot; ist veraltet.</p>
<p>In C++11 kann Pass By Value den Aufruf eines Move-Konstruktors statt eines Kopierkonstruktors bedeuten. Daher macht es sehr wohl Sinn, nichtkopierbare Objekte als Wert zu übergeben.</p>
<p>Lies dir vielleicht die Artikelserie auf <a href="http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/" rel="nofollow">C++Next</a> durch, da wird Move-Semantik gut erklärt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347571</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 21 Aug 2013 16:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Thu, 22 Aug 2013 06:24:57 GMT]]></title><description><![CDATA[<blockquote>
<p>Es war doch genau die Frage, wie man ein Objekt per Value über geben kann, dass nicht kopiert werden kann.</p>
</blockquote>
<p>In dem man nicht den Kopierkonstruktor involviert, sondern den Move-Konstruktor. Wenn du ein <em>rvalue</em>- <code>unique_ptr</code> an die Funktion übergibst, dann wird ebenjener aufgerufen, und der als <code>deleted</code> definierte Kopierkonstruktor hat nix zu suchen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347577</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347577</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 22 Aug 2013 06:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Wed, 21 Aug 2013 20:45:44 GMT]]></title><description><![CDATA[<p>Das ist alles verdammt kompliziert mit der move Semantik und rvalues. Ich dachte ich hätte das halbwegs verstanden aber es ist doch nicht so <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="😞"
    /> Zumindest waren eure Erklärungen jetzt bei mehrfachen lesen ein bisschen erhellend.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347641</guid><dc:creator><![CDATA[TNA]]></dc:creator><pubDate>Wed, 21 Aug 2013 20:45:44 GMT</pubDate></item><item><title><![CDATA[Reply to unique_ptr Funktionsargument on Thu, 22 Aug 2013 10:48:45 GMT]]></title><description><![CDATA[<p>Vielleicht hilft dir ja ein <a href="http://www.c-plusplus.net/forum/292337#2116477" rel="nofollow">älterer Beitrag</a> von mir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347763</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 22 Aug 2013 10:48:45 GMT</pubDate></item></channel></rss>