<?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[&amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich?]]></title><description><![CDATA[<p>Hallo</p>
<p>mich würde interessieren, ob es zulässig und vor allem sinnvoll ist, in einem eigenen Container einen Move-Konstruktor anzubieten, der als Parameter einen Container anderen Typs bekommt. (Vielleicht ist dann der Begriff Move-Konstruktor nicht mehr ganz korrekt.) Die Bedingung, dass beide Containertypen ihre Daten in einem zusammenhängenden Speicherbereich verwalten, sei gegeben.</p>
<p>Im Prinzip möchte ich etwas in dieser Art machen:</p>
<pre><code>template&lt;class T&gt;
class MyContainer
{
protected:
    T* m_data;
    size_t m_size;

public:

    MyContainer(std::vector&amp;&amp; rhs)
    : m_data(rhs.data),
      size(rhs.size)
    {
        rhs.data = nullptr;
    }
};
</code></pre>
<p>Konkret hätte ich folgende Fragen:<br />
1. Funktioniert diese Vorgehensweise im konkreten Fall überhaupt?<br />
2. Ist sie auch empfehlenswert oder sollte man sowas tunlichst unterlassen?<br />
3. Gibt es überhaupt Fälle, in denen ein Konstruktor dieses Typs (nimmt rValue-reference eines anderen Typs) in Ordnung wäre?<br />
4. Falls das in dieser Form akzeptabel ist, ist es dann auch akzeptabel einen entsprechenden Zuweisungsoperator (mit rValue) analog zu implementieren?</p>
<p>Vielen Dank schonmal vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/321895/quot-move-ctor-quot-mit-anderem-parametertyp-möglich</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Jul 2026 15:46:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321895.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 Nov 2013 10:50:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 10:50:41 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>mich würde interessieren, ob es zulässig und vor allem sinnvoll ist, in einem eigenen Container einen Move-Konstruktor anzubieten, der als Parameter einen Container anderen Typs bekommt. (Vielleicht ist dann der Begriff Move-Konstruktor nicht mehr ganz korrekt.) Die Bedingung, dass beide Containertypen ihre Daten in einem zusammenhängenden Speicherbereich verwalten, sei gegeben.</p>
<p>Im Prinzip möchte ich etwas in dieser Art machen:</p>
<pre><code>template&lt;class T&gt;
class MyContainer
{
protected:
    T* m_data;
    size_t m_size;

public:

    MyContainer(std::vector&amp;&amp; rhs)
    : m_data(rhs.data),
      size(rhs.size)
    {
        rhs.data = nullptr;
    }
};
</code></pre>
<p>Konkret hätte ich folgende Fragen:<br />
1. Funktioniert diese Vorgehensweise im konkreten Fall überhaupt?<br />
2. Ist sie auch empfehlenswert oder sollte man sowas tunlichst unterlassen?<br />
3. Gibt es überhaupt Fälle, in denen ein Konstruktor dieses Typs (nimmt rValue-reference eines anderen Typs) in Ordnung wäre?<br />
4. Falls das in dieser Form akzeptabel ist, ist es dann auch akzeptabel einen entsprechenden Zuweisungsoperator (mit rValue) analog zu implementieren?</p>
<p>Vielen Dank schonmal vorab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368572</guid><dc:creator><![CDATA[Datendieb]]></dc:creator><pubDate>Thu, 28 Nov 2013 10:50:41 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 10:56:30 GMT]]></title><description><![CDATA[<p>1. Nein, du kannst vector nicht beibringen dass er seinen Kram nicht delete[]en soll.<br />
2. Spricht so erstmal nichts dagegen, außer dass es eben hier nicht geht.<br />
3. Ja, du kannst im Prinzip als Argument nehmen was du willst. Das ist dann streng genommen kein copy/move Konstruktor, aber das interessiert ja erst mal nicht.<br />
4. Das wäre es, wenn es denn funktionieren würde.</p>
<p>Bei der ganzen Aktion fragt man sich allerdings wozu das gut sein soll, und warum du nicht intern einfach wieder einen std::vector speicherst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368574</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Thu, 28 Nov 2013 10:56:30 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 11:17:38 GMT]]></title><description><![CDATA[<p>Vielen Dank für die schnelle Antwort!</p>
<p>cooky451 schrieb:</p>
<blockquote>
<p>1. Nein, du kannst vector nicht beibringen dass er seinen Kram nicht delete[]en soll.</p>
</blockquote>
<p>Das hätte ich natürlich einfach mal ausprobieren können <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    />, trotzdem danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368579</guid><dc:creator><![CDATA[Datendieb]]></dc:creator><pubDate>Thu, 28 Nov 2013 11:17:38 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 11:23:23 GMT]]></title><description><![CDATA[<blockquote>
<p>1. Nein, du kannst vector nicht beibringen dass er seinen Kram nicht delete[]en soll.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Edit: Nein, ist natuerlich Unsinn.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368581</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 28 Nov 2013 11:23:23 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 11:47:01 GMT]]></title><description><![CDATA[<p>Wenn das wirklich gewünscht ist, kann das Verhalten mit relativ wenig Overhead bereitgestellt werden.</p>
<p>Pseudocode:</p>
<pre><code class="language-cpp">template &lt;class C&gt;
struct basic_storage {
  virtual T* data()=0;
  virtual size_t size()=0;
  virtual ~basic_storage(){}
};
template &lt;class C&gt;
struct container_storage : basic_storage&lt;C&gt; {
  C storage;
  container_storage(C&amp;&amp; c) : storage(std::move(c)); }
  T* data() { return storage.data(); }
  size_t size() { return storage.size(); }
};
template &lt;class T&gt;
struct default_storage_holder : basic_storage {
  ...
};
template&lt;class T&gt;
class MyContainer
{
    T* data_;
    size_t size_;
    std::unique_ptr&lt;basic_storage&lt;T&gt; &gt; storage_holder;

    void init()
    {
       data_ = storage_holder-&gt;data();
       size_ = storage_holder-&gt;size();
    }

public:
    MyContainer(std::vector&amp;&amp; rhs)
    : storage_holder(new container_storage_holder(std::move(rhs)))
    { init(); }
    MyContainer(size_t n)
    : storage_holder(new default_storage_holder(n))
    { init(); }

    ...
};
</code></pre>
<p>Wenn du den Allocator im Typ mitführst (was etwas Umständlicher ist, aber bei sehr vielen sehr kleinen Vektoren [was man besser vermeiden sollte] einen Unterschied machen kann), kann das Type-Erasure umgangen werden.</p>
<p>PS:</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Edit: Nein, ist <strong>natuerlich</strong> Unsinn.</p>
</blockquote>
<p>So stimmt zumindest schon die Formulierung <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/2368587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368587</guid><dc:creator><![CDATA[natürlich]]></dc:creator><pubDate>Thu, 28 Nov 2013 11:47:01 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 13:29:45 GMT]]></title><description><![CDATA[<p>natürlich schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Toll, du haeltst dann einfach intern einen zweiten <code>vector</code> , damit waere das lediglich ein Adapter.</p>
<p>Edit: Nein, das koennte in der Tat das sein, was der TE wollte. Die Frage ist, was dieser ueberhaupt braucht - bzw. welches Problem er damit loest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368608</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 28 Nov 2013 13:29:45 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 13:22:45 GMT]]></title><description><![CDATA[<p>Biete einen Konstruktor an, der eine Iterator-Range nimmt. Dann kann der Benutzer immer noch mit <code>std::move_iterator</code> Elemente aus einem anderen Container verschieben.</p>
<p>Die interne Datenstruktur verschiedener Container zu verschieben ist meist unmöglich (da du keinen Zugriff hast und sie sich unterscheidet).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368609</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 28 Nov 2013 13:22:45 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 17:12:02 GMT]]></title><description><![CDATA[<p>Datendieb schrieb:</p>
<blockquote>
<p>3. Gibt es überhaupt Fälle, in denen ein Konstruktor dieses Typs (nimmt rValue-reference eines anderen Typs) in Ordnung wäre?</p>
</blockquote>
<p>Ich nehme an dass die Frage unabhängig vom konkreten Fall &quot;Container&quot; zu verstehen ist.</p>
<p>Dann: ja, klar. Ich könnte mir z.B. vorstellen dass man zwecks Kapselung ein und die selben Daten einmal in &quot;editierbarer&quot; und einmal in &quot;nur lesbarer&quot; Form haben möchte.</p>
<p>Könnten verschiedenste Dinge sein, z.B. irgendwelche Datenobjekte mit Business-Rules, 3D-Meshes - was auch immer.<br />
Einen Grossteil davon könnte man noch mit <code>const</code> erschlagen. Aber die &quot;nur lesbare&quot; Form könnte vielleicht deutlich weniger Dependencies haben, und verwendet werden um an Modulgrenzen den Dependency-Wildwuchs einzudämmen.<br />
Wenn man die Objekte dann von einer Form in die andere bringen kann, und die interne Repräsentation gleich ist, dann kann so ein &quot;konsumierender Konvertierungskonstruktor&quot; schon Sinn machen.</p>
<p>Bzw. eine andere Sache wo <code>const</code> nicht ausreicht wäre wenn man nur einen Teil der Daten der &quot;editierbaren&quot; Form übernehmen will -- weil diverse Hilfsobjekte/Indexe/Einträge in der &quot;nur lesbaren&quot; Form nicht nötig sind. Dann kann die nur lesbare Form die editierbare beklauen, und einfach alles freigeben was sie nicht braucht.</p>
<p>Oder ein FileLogger wo ich das zu Output-File beim Konstruieren des Loggers &quot;reinmoven&quot; kann hätte auch so einen Konstruktor. Wäre semantisch dann zwar kein Kopierkonstruktor mehr, formal aber genau das selbe (Rvalue Konvertierungskonstruktor halt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368692</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 28 Nov 2013 17:12:02 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 17:48:46 GMT]]></title><description><![CDATA[<p>Zunächst noch einmal danke für die Antworten und Anregungen!</p>
<p>Arcoth  schrieb:</p>
<blockquote>
<p>Nein, das koennte in der Tat das sein, was der TE wollte. Die Frage ist, was dieser ueberhaupt braucht - bzw. welches Problem er damit loest.</p>
</blockquote>
<p>Vielleicht noch einmal ein paar Worte zum Hintergrund:<br />
In den Softwaremodulen, an denen ich mitarbeite, werden selbst implementierte Container verwendet, sind an sehr vielen Stellen im Einsatz und haben gegenüber den STL-Containern einige Limitationen. In Fällen, in denen man die STL-Algorithmen gerne einsetzen würde, das aber nicht ohne weiteres kann, weil die Daten in einem eigenen Container liegen, werden dann oft einfach &quot;STL-Kopien&quot; erstellt und auf diesen gearbeitet.<br />
Ich hatte mir dann die Frage gestellt, ob sich zumindest in manchen Fällen die Kopien vermeiden ließen, indem man die Daten an einen STL-Container transferiert. Und weil das Thema move-semantics für mich recht neu ist, kamen auch ein paar grundsätzliche Fragen auf. So kam es zu diesem Thread.</p>
<p>Vielleicht geht dieser Ansatz aber ohnehin in die komplett falsche Richtung und es müsste z.B. über die Iteratoren gehen...<br />
Wenn es diesbezüglich bessere Ideen gibt, höre ich mir die natürlich gerne an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368706</guid><dc:creator><![CDATA[Datendieb]]></dc:creator><pubDate>Thu, 28 Nov 2013 17:48:46 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 17:57:46 GMT]]></title><description><![CDATA[<blockquote>
<p>In den Softwaremodulen, an denen ich mitarbeite, werden selbst implementierte Container verwendet, sind an sehr vielen Stellen im Einsatz und haben gegenüber den STL-Containern einige Limitationen.</p>
</blockquote>
<p>Warum zum Teufel schreibt ihr die STL neu?</p>
<blockquote>
<p>In Fällen, in denen man die STL-Algorithmen gerne einsetzen würde, das aber nicht ohne weiteres kann, weil die Daten in einem eigenen Container liegen</p>
</blockquote>
<p>Moment, das ist kein Grund. STL-Algorithmen arbeiten über Iteratoren, die kann jeder Container anbieten, auch über Zeiger. Gerade deswegen ist es ja so sexy.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368707</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 28 Nov 2013 17:57:46 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 19:07:18 GMT]]></title><description><![CDATA[<p>Sexy finde ich iteratoren nicht greade. Flexibel ist es natürlich, und daher, wenn man diese Flexibilität mal braucht, praktisch.<br />
(So lange man es nicht braucht nervt es aber eher.)</p>
<p>`boost::trim(str); // yeah</p>
<p>std::sort(str.begin(), str.end()); // f<code></code>uck off!`<br />
<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/2368725</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368725</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 28 Nov 2013 19:07:18 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 19:50:42 GMT]]></title><description><![CDATA[<pre><code>#define RANGE(r) (r).begin(), (r).end()

std::sort(RANGE(str)); // fuck yeah!
</code></pre>
<p>Moment! Wieso darf hustbaer das f-Wort schreiben, und ich nicht!? <code>fuck</code> !</p>
<p>Edit: Natürlich besser:</p>
<pre><code>#define RANGE(r) std::begin(r), std::end(r)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2368730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368730</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 28 Nov 2013 19:50:42 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 19:56:19 GMT]]></title><description><![CDATA[<p>Besserer:</p>
<pre><code>boost::sort(str)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2368734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368734</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 28 Nov 2013 19:56:19 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 19:58:58 GMT]]></title><description><![CDATA[<p>Ja, natürlich. Ich dachte, es ging hier um Standardmittel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2368737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368737</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 28 Nov 2013 19:58:58 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 21:16:00 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Moment! Wieso darf hustbaer das f-Wort schreiben, und ich nicht!? <code>love</code> !</p>
</blockquote>
<p>Dafür musst du mehr als 10K Beiträge haben.</p>
<p>Ne, ernsthaft - guck einfach nach wie ich es gemacht hab, ist ja nicht schwer rauszufinden <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/2368748</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368748</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 28 Nov 2013 21:16:00 GMT</pubDate></item><item><title><![CDATA[Reply to &amp;quot;move-ctor&amp;quot; mit anderem Parametertyp möglich? on Thu, 28 Nov 2013 21:28:18 GMT]]></title><description><![CDATA[<p>Oh, ein sehr gewitzter Trick <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/2368751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2368751</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 28 Nov 2013 21:28:18 GMT</pubDate></item></channel></rss>