<?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[STL Container und nur Moveable-Types in C++03]]></title><description><![CDATA[<p>C++03 folgender Typ:</p>
<pre><code class="language-cpp">struct M {
  std::vector&lt;unsigned char&gt; image;
  M() {}
  M(M&amp; m) { // moving with copy constructor
    image.swap(m.image);
  }

  void operator=(M&amp; m) { // moving with assignment operator
    image.swap(m.image);
    m.image.clear();
  }
};
</code></pre>
<p>Um einen Typ <code>T</code> mit <code>std::vector</code> zu benutzen, muss er kopierbar sein. <code>M</code> ist das leider nicht. Was passiert wenn ich es trotzdem mache? Was geht kaputt? Reicht es, einen Containeradapter zu schreiben und alle kaputten Operationen einfach nicht anzubieten? Der Typ M soll beispielsweise in <code>std::priority_queue</code> oder in <code>std::deque</code> benutzt werden.</p>
<p>Als Alternative bietet boost (nur 1.49 verfuegbar) in seiner Containerbibliothek Klassen an, die diese Einschraenkungen nicht besitzen. Gibt es dazu ein Tutorial? Prinzipiell fand ich das Beispiel etwas zu makrolastig. Auch wuerde ich eher auf die C++ Standardbibliothek als auf boost zurueckreifen.</p>
<pre><code class="language-cpp">//Non-copyable class
class non_copyable
{
   BOOST_MOVABLE_BUT_NOT_COPYABLE(non_copyable)

   public:
   non_copyable(){}
   non_copyable(BOOST_RV_REF(non_copyable)) {}
   non_copyable&amp; operator=(BOOST_RV_REF(non_copyable)) { return *this; }
};
</code></pre>
<p>Welche anderen Alternativen bieten sich?</p>
<p>Der Container <code>std::vector&lt;M&gt;</code> selbst soll niemals kopiert oder sortiert werden (bei <code>std::priority_queue</code> ) wohl nicht vermeidbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313265/stl-container-und-nur-moveable-types-in-c-03</link><generator>RSS for Node</generator><lastBuildDate>Sun, 02 Aug 2026 07:49:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313265.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 25 Jan 2013 17:17:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Fri, 25 Jan 2013 18:06:50 GMT]]></title><description><![CDATA[<p>C++03 folgender Typ:</p>
<pre><code class="language-cpp">struct M {
  std::vector&lt;unsigned char&gt; image;
  M() {}
  M(M&amp; m) { // moving with copy constructor
    image.swap(m.image);
  }

  void operator=(M&amp; m) { // moving with assignment operator
    image.swap(m.image);
    m.image.clear();
  }
};
</code></pre>
<p>Um einen Typ <code>T</code> mit <code>std::vector</code> zu benutzen, muss er kopierbar sein. <code>M</code> ist das leider nicht. Was passiert wenn ich es trotzdem mache? Was geht kaputt? Reicht es, einen Containeradapter zu schreiben und alle kaputten Operationen einfach nicht anzubieten? Der Typ M soll beispielsweise in <code>std::priority_queue</code> oder in <code>std::deque</code> benutzt werden.</p>
<p>Als Alternative bietet boost (nur 1.49 verfuegbar) in seiner Containerbibliothek Klassen an, die diese Einschraenkungen nicht besitzen. Gibt es dazu ein Tutorial? Prinzipiell fand ich das Beispiel etwas zu makrolastig. Auch wuerde ich eher auf die C++ Standardbibliothek als auf boost zurueckreifen.</p>
<pre><code class="language-cpp">//Non-copyable class
class non_copyable
{
   BOOST_MOVABLE_BUT_NOT_COPYABLE(non_copyable)

   public:
   non_copyable(){}
   non_copyable(BOOST_RV_REF(non_copyable)) {}
   non_copyable&amp; operator=(BOOST_RV_REF(non_copyable)) { return *this; }
};
</code></pre>
<p>Welche anderen Alternativen bieten sich?</p>
<p>Der Container <code>std::vector&lt;M&gt;</code> selbst soll niemals kopiert oder sortiert werden (bei <code>std::priority_queue</code> ) wohl nicht vermeidbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293432</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293432</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 25 Jan 2013 18:06:50 GMT</pubDate></item><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Fri, 25 Jan 2013 17:24:42 GMT]]></title><description><![CDATA[<p>Wenn M selbst sowieso aus Pointern besteht (so ist std::vector aufgebaut), weshalb hältst du dann nicht gleich ein <code>shared_ptr&lt;unsigned char[]&gt;</code> ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293438</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293438</guid><dc:creator><![CDATA[plointer]]></dc:creator><pubDate>Fri, 25 Jan 2013 17:24:42 GMT</pubDate></item><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Fri, 25 Jan 2013 17:31:32 GMT]]></title><description><![CDATA[<p>1.) Weil shared_ptr kein size-Attribut hat.<br />
2.) Weil ich kein Ownership teilen moechte.<br />
3.) Weil ich keine Synchronization moechte.<br />
4.) Keine Ahnung ob g++ 3.3.5 den in irgendeiner Weise zur Verfuegung stellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293444</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 25 Jan 2013 17:31:32 GMT</pubDate></item><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Fri, 25 Jan 2013 17:31:40 GMT]]></title><description><![CDATA[<p>Das Problem ist, dass dein M kopierbar 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="😉"
    /><br />
Das Konzept eines moveable aber nicht copyable Type lässt sich in C++03 afaik nicht vernünftig ausdrücken. Wenn ich deine <code>M</code> s in einen vector <code>stuff</code> packe und dann z.B. schreib <code>M bla = stuff[123]</code> , dann kompiliert das problemlos, ist aber ganz und gar nicht toll. Möglicherweise kann man mit const was tricksen, z.B. dass man so ein implizites Moven verhindert, indem man die Objekte im vector const macht. Eine wirklich allgemeine und elegante Lösung gibt es aber wohl nicht...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293446</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 25 Jan 2013 17:31:40 GMT</pubDate></item><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Fri, 25 Jan 2013 17:46:06 GMT]]></title><description><![CDATA[<p>Das ist korrekt, d.h. dein Beispiel waere solch ein Defekt. Konkret soll die Klasse M eine Nachricht repraesentieren und in <code>std::priority_queue</code> und <code>std::deque</code> verwendet. Diese haben bereits ein beschraenktes Interface und bieten nur push und pop in verschiedenen Variationen an. Aber der darunterliegende Container ist per default ein <code>std::vector</code> . Das ist das Problem.</p>
<p>Erzingen <code>std::priority_queue</code> oder <code>std::queue</code> ebenfalls, dass der Typ kopierbar (im Sinne von: a = b =&gt; a == b) sein muss?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293452</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 25 Jan 2013 17:46:06 GMT</pubDate></item><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Fri, 25 Jan 2013 17:53:51 GMT]]></title><description><![CDATA[<p>Wieso genau muss M denn moveable sein? Könnte man das entsprechende Konzept nicht vielleicht im Interface des Containers ausdrücken, also z.B. einfach einen entsprechenden Container Adapter bauen und M in Ruhe lassen?</p>
<p>Afaik ist Kopierbarkeit mehr oder weniger eine Grundanforderung aller Standardcontainer in C++03 (genaugenommen sind die Anforderungen an den Typen afaik für jede Operation extra definiert, aber ohne Kopierbarkeit wird der Container wohl praktisch nutzlos, zumindest std::vector und vermutlich auch deque, bei list, map oder set kann mal unter Umständen ohne davonkommen).</p>
<p>Edit: Ok, ohne Default Ctor und Copy Assignment könnte man bei list etc. evtl. noch leben, aber ohne Copy Ctor wirds schwer...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293454</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293454</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Fri, 25 Jan 2013 17:53:51 GMT</pubDate></item><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Fri, 25 Jan 2013 17:52:21 GMT]]></title><description><![CDATA[<p>Edit: -</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293460</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Fri, 25 Jan 2013 17:52:21 GMT</pubDate></item><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Fri, 25 Jan 2013 18:06:02 GMT]]></title><description><![CDATA[<blockquote>
<p>Container Adapter bauen</p>
</blockquote>
<p>Habe ich ja schon, <code>std::priority_queue</code> und <code>std::queue</code> .</p>
<blockquote>
<p>Container wohl praktisch nutzlos</p>
</blockquote>
<p>Nun, ich will die Elemente nur in den Container reinpacken und wieder rausholen. Eine Messagequeue halt. Sie soll nicht kopiert werden.</p>
<p>Nun fehlt mir leider das Detailwissen. Bei SGIs STL Beschreibung (Wo sonst steht das vernuenftig?) steht beispielsweise Nur Assignable und nur wenn operator== benutzt wird, dann sollte EqualityComparable sein. Wenn ich == im Beispiel von <code>std::queue&lt;M&gt;</code> nicht benutze, kann ich dann auch sicher sein, dass nicht schlimmes passiert, wenn der darunterliegende Container <code>std::vector&lt;M&gt;</code> ist?</p>
<p>Ziel ist natuerlich, so viel wie moeglich aus der C++ Standardbibliothek nachzunutzen, insbesondere Container (weil Nachrichten als Elemente einfacher selbst zu implementieren sind), und unnoetige Kopieroperationen von Nachrichten zu vermeiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293464</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 25 Jan 2013 18:06:02 GMT</pubDate></item><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Fri, 25 Jan 2013 18:09:21 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>g++ 3.3.5</p>
</blockquote>
<p>Der ist allerdings schon ziemlich lange EOL.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293467</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Fri, 25 Jan 2013 18:09:21 GMT</pubDate></item><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Fri, 25 Jan 2013 18:18:19 GMT]]></title><description><![CDATA[<p>Die Problematik wurde vor allem durch die Speicherung von <code>std::auto_ptr</code> in STL-Containern bekannt. Wenn du danach suchst, findest du genauere Informationen.</p>
<p>Aber grundsätzlich erfordern STL-Container in C++03 nicht-destruktive Kopierbarkeit. Wenn du diese verletzt, sind Probleme nicht ausgeschlossen. Allerdings wird es schon schwierig, dass der Code überhaupt kompiliert.</p>
<pre><code>void std::vector&lt;T&gt;::push_back(const T&amp; element)
{
    T copy(element);
    ...
}

std::vector&lt;M&gt; vec;
M obj;              // hat Kopierkonstruktor M::M(M&amp;)
vec.push_back(obj); // keine Kopie von Const-Referenz möglich
</code></pre>
<p>Früher habe ich in diesen Fällen oft Boosts Pointer-Container benutzt. Zur Not tuts auch ein <code>std::vector&lt;T*&gt;</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293476</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 25 Jan 2013 18:18:19 GMT</pubDate></item><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Fri, 25 Jan 2013 18:35:30 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>knivil schrieb:</p>
<blockquote>
<p>g++ 3.3.5</p>
</blockquote>
<p>Der ist allerdings schon ziemlich lange EOL.</p>
</blockquote>
<p>Ja, aber leider habe ich keine Wahl. Vielleicht ... mal schauen.</p>
<blockquote>
<p>Die Problematik wurde vor allem durch die Speicherung von std::auto_ptr in STL-Containern bekannt. Wenn du danach suchst, findest du genauere Informationen.</p>
</blockquote>
<p>Ja, das ist mir bekannt, deswegen frage ich ja. Aber alle haben nur ein <code>std::vector</code> als Beispiel.</p>
<blockquote>
<p>Zur Not tuts auch ein std::vector&lt;T*&gt;</p>
</blockquote>
<p>Das wird es wohl werden und ich werde dots Vorschlag folgeleisten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2293481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2293481</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Fri, 25 Jan 2013 18:35:30 GMT</pubDate></item><item><title><![CDATA[Reply to STL Container und nur Moveable-Types in C++03 on Mon, 28 Jan 2013 02:41:00 GMT]]></title><description><![CDATA[<p>boost.move?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2294034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2294034</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Mon, 28 Jan 2013 02:41:00 GMT</pubDate></item></channel></rss>