<?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[Copy-and-swap Idiom]]></title><description><![CDATA[<p>Seit wann gibts das Copy-and-swap Idiom und wer ist auf die Idee gekommen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261475/copy-and-swap-idiom</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 07:28:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261475.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Feb 2010 20:56:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Copy-and-swap Idiom on Thu, 18 Feb 2010 20:56:28 GMT]]></title><description><![CDATA[<p>Seit wann gibts das Copy-and-swap Idiom und wer ist auf die Idee gekommen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857890</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857890</guid><dc:creator><![CDATA[nicht sein]]></dc:creator><pubDate>Thu, 18 Feb 2010 20:56:28 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Thu, 18 Feb 2010 21:09:42 GMT]]></title><description><![CDATA[<p>Ich vermute mal dass sich das nichtmehr ermitteln lassen wird.<br />
Das Copy &amp; Swap Idiom ist ja mit an Sicherheit grenzender Wahrscheinlichkeit schon älter als C++.<br />
Wenn man es weit genug auslegt geht das in die Urgeschichte der Menschheit zurück, lange bevor es Computer gab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857897</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 18 Feb 2010 21:09:42 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 00:12:37 GMT]]></title><description><![CDATA[<p>Weil ich gerade über diesen Thread gestolpert bin: Was genau ist denn eigentlich das Copy&amp;Swap Idiom?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857982</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 19 Feb 2010 00:12:37 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 00:21:41 GMT]]></title><description><![CDATA[<p>daersc schrieb:</p>
<blockquote>
<p>Weil ich gerade über diesen Thread gestolpert bin: Was genau ist denn eigentlich das Copy&amp;Swap Idiom?</p>
</blockquote>
<pre><code class="language-cpp">Foo&amp; operator=(const Foo&amp; f){
  Foo tmp(f);//klappt oder klappt nicht, ka, vielleicht kein speicher da?
//exception flieg oder fliegt nicht, alles ok. 
  swap(*this,tmp);//klappt sicher!!!
}
</code></pre>
<p>im Gegenśatz zum</p>
<pre><code class="language-cpp">Foo&amp; operator=(const Foo&amp; f){
  ort=f.ort;//klappt mal
  name=f.name;//klappt mal nicht, oh weh!!!
//exception fliegt und das objekt hat den ort schon geändert, aber noch 
//den meinen namen. die oma wird sich aber wundern, wenn sie die für mich 
//bestimmten pakete vom orion-versand bekommt. 
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1857986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857986</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 19 Feb 2010 00:21:41 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 00:29:24 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<pre><code class="language-cpp">//den meinen namen. die oma wird sich aber wundern, wenn sie die für mich 
//bestimmten pakete vom orion-versand bekommt.
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857988</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 19 Feb 2010 00:29:24 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 01:39:34 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Ich vermute mal dass sich das nichtmehr ermitteln lassen wird.<br />
Das Copy &amp; Swap Idiom ist ja mit an Sicherheit grenzender Wahrscheinlichkeit schon älter als C++.<br />
Wenn man es weit genug auslegt geht das in die Urgeschichte der Menschheit zurück, lange bevor es Computer gab.</p>
</blockquote>
<p>Wo sollte man das noch brauchen? Wo hast du außerhalb vom Computer Operatorüberladung?</p>
<p>Und wenn es das schon vorher gab, wann ist einer auf die Idee gekommen, dass man das bei C++ braucht?<br />
Und wieso findet man es in so wenig Frameworks? z.B.<br />
QByteArray<br />
<a href="http://www.koders.com/cpp/fid379C1B6DC09294E1484E7D9790E06891E714737C.aspx?s=cdef%3Aparser" rel="nofollow">http://www.koders.com/cpp/fid379C1B6DC09294E1484E7D9790E06891E714737C.aspx?s=cdef%3Aparser</a><br />
QString<br />
<a href="http://www.koders.com/cpp/fidFE1F7EFDF0758981038967272E930C0DEEC0DAD4.aspx?s=cdef%3Aparser" rel="nofollow">http://www.koders.com/cpp/fidFE1F7EFDF0758981038967272E930C0DEEC0DAD4.aspx?s=cdef%3Aparser</a><br />
kein swap im ganzen Code.<br />
Kennt das keiner?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858011</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858011</guid><dc:creator><![CDATA[nicht sein]]></dc:creator><pubDate>Fri, 19 Feb 2010 01:39:34 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 01:56:44 GMT]]></title><description><![CDATA[<blockquote>
<p>nicht sein schrieb:</p>
<blockquote>
<p>mit an Sicherheit grenzender Wahrscheinlichkeit schon älter als C++. Wenn man es weit genug auslegt geht das in die Urgeschichte der Menschheit zurück, lange bevor es Computer gab.</p>
</blockquote>
<p>Wo sollte man das noch brauchen? Wo hast du außerhalb vom Computer Operatorüberladung?</p>
</blockquote>
<p>Naja, der Mönch sagt, ich will erst das Buch komplett kopieren und dann mit dem Nachbarkloster gegen leeres Papier tauschen, statt seitenweise Kuddelmuddel zu machen.<br />
Aber schon der Urzeitmensch sagte, ich will erst das Mammut totmachen, und es dann reiholen und den Müll raustragen, sonst gibt es nur Kuddelmuddel.<br />
Irgendwo dazwischen, davor oder danach mögen die Urgründe des Copy&amp;Spap liegen, wenn man es so weit sehen will.<br />
Natürlich war das Copy&amp;Swap in C++ gemeint, das dürfte nicht älter als C++ sein. Wikipedia sagt afair, RAII sei Stuppis Erfindung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858014</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 19 Feb 2010 01:56:44 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 02:09:41 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<blockquote>
<p>nicht sein schrieb:</p>
<blockquote>
<p>mit an Sicherheit grenzender Wahrscheinlichkeit schon älter als C++. Wenn man es weit genug auslegt geht das in die Urgeschichte der Menschheit zurück, lange bevor es Computer gab.</p>
</blockquote>
<p>Wo sollte man das noch brauchen? Wo hast du außerhalb vom Computer Operatorüberladung?</p>
</blockquote>
<p>Naja, der Mönch sagt, ich will erst das Buch komplett kopieren und dann mit dem Nachbarkloster gegen leeres Papier tauschen, statt seitenweise Kuddelmuddel zu machen.<br />
Aber schon der Urzeitmensch sagte, ich will erst das Mammut totmachen, und es dann reiholen und den Müll raustragen, sonst gibt es nur Kuddelmuddel.<br />
Irgendwo dazwischen, davor oder danach mögen die Urgründe des Copy&amp;Spap liegen, wenn man es so weit sehen will.</p>
</blockquote>
<p>Da wird aber nicht wirklich ein Swap in ein temporäres Objekt gemacht. Die Seiten eines Buches werden ja nicht überschrieben. Da müsstest du ja zwei Bücher haben und die Buchstaben tauschen oder sowas. Und wer weiß schon, ob beim Buchstaben tauschen nicht doch eine Exception fliegt. <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/1858015</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858015</guid><dc:creator><![CDATA[nicht sein]]></dc:creator><pubDate>Fri, 19 Feb 2010 02:09:41 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 02:13:47 GMT]]></title><description><![CDATA[<p>nicht sein schrieb:</p>
<blockquote>
<p>Und wer weiß schon, ob beim Buchstaben tauschen nicht doch eine Exception fliegt. <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>
</blockquote>
<p>Das wichtigste am copy&amp;swap ist ja, dass swap <strong>nothrow</strong> ist!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858016</guid><dc:creator><![CDATA[Mammut-Nichtwerfer]]></dc:creator><pubDate>Fri, 19 Feb 2010 02:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 09:32:59 GMT]]></title><description><![CDATA[<p>nix^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858070</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 19 Feb 2010 09:32:59 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 09:53:20 GMT]]></title><description><![CDATA[<p>Wobei das mit dem std::swap in op= eine ganz schlechte Idee ist (hatten wir hier kürzlich schonmal). Denn std::swap wird sicherlich selber op= aufrufen, was zimlich sicher in die Hose geht <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>
<pre><code class="language-cpp">#include &lt;algorithm&gt;

struct Test
{
        int member;
        Test() : member(10) {
        }
        Test( const Test&amp; other ) {
                member = other.member;
        }
        Test&amp; operator =( const Test&amp; other ) {
                Test tmp(other);
                std::swap( *this, tmp );
                return *this;
        }
};

int main() {
        Test t1, t2;
        t2 = t1;
}
</code></pre>
<p>segfaultet hier...<br />
Da ist eine private Swap-Funktion besser, die hat Zugriff auf die Member und kann diese einzeln swappen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858075</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Fri, 19 Feb 2010 09:53:20 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 11:42:16 GMT]]></title><description><![CDATA[<p><code>std::swap( *this, tmp );</code> ist ja auch fail^^<br />
-&gt;</p>
<pre><code class="language-cpp">using std::swap;
swap(*this, tmp);
</code></pre>
<p>und:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct swappable
{
  friend void swap(T&amp; lhs, T&amp; rhs)
  {
    lhs.swap(rhs);
  }
};

struct test : swappable&lt;test&gt;
{
  void swap(test&amp; other)
  {
    /*...*/
  }
};

#if defined(NO_ADL_SWAP)
void std::swap(test&amp; lhs, test&amp; rhs)
{
  lhs.swap(rhs);
}
#endif
</code></pre>
<p>swap zu überladen ist hier auch laut standard kein problem - aber wenn templates ins spiel kommen ist es eine spezialisierung und die ist laut standard streng genommen nicht gestattet - aber imho sowohl bei der msvc-standard-lib als auch bei der gcc-lib nötig.<br />
bei der gcc-lib müsste man so gar noch iter_swap irgendwie überladen - auch wenn ich gerade keine ahnung habe, wie das gehen sollte...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858130</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 19 Feb 2010 11:42:16 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 12:00:19 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>swap zu überladen ist hier auch laut standard kein problem - aber wenn templates ins spiel kommen ist es eine spezialisierung und die ist laut standard streng genommen nicht gestattet</p>
</blockquote>
<p>Umgekehrt. Spezilisierung ist zulässig, soweit eigene Typen involviert sind. Überladung hingegen nicht (in C++0x wird das iirc etwas gelockert).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858139</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858139</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 19 Feb 2010 12:00:19 GMT</pubDate></item><item><title><![CDATA[Reply to Copy-and-swap Idiom on Fri, 19 Feb 2010 12:02:40 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>swap zu überladen ist hier auch laut standard kein problem - aber wenn templates ins spiel kommen ist es eine spezialisierung und die ist laut standard streng genommen nicht gestattet</p>
</blockquote>
<p>Umgekehrt. Spezilisierung ist zulässig, soweit eigene Typen involviert sind. Überladung hingegen nicht (in C++0x wird das iirc etwas gelockert).</p>
</blockquote>
<p>oh - ich sollte nicht immer so lang schlafen, dann wär ich auch nicht immer so verpeilt ;o)<br />
danke für die richtigstellung^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1858143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1858143</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Fri, 19 Feb 2010 12:02:40 GMT</pubDate></item></channel></rss>