<?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[&#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Klasse deren Konstruktor zwei Variablen übergeben kriegt.<br />
Falls die Variablen noch benötigt werden, soll der Copy-Constructor aufgerufen werden, sonst der Move-Constructor.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct Foo{
	Foo(){}
	Foo(const Foo&amp;) { std::cout &lt;&lt; &quot;copy Foo&quot; &lt;&lt; std::endl;}
	Foo(Foo&amp;&amp;) { std::cout &lt;&lt; &quot;move Foo&quot; &lt;&lt; std::endl;}
};

struct Bar{
	Bar(){}
	Bar(const Bar&amp;) { std::cout &lt;&lt; &quot;copy Bar&quot; &lt;&lt; std::endl;}
	Bar(Bar&amp;&amp;) { std::cout &lt;&lt; &quot;move Bar&quot; &lt;&lt; std::endl;}
};

struct FooBar {
	FooBar(const Foo&amp; foo, const Bar&amp; bar) : _foo(foo), _bar(bar) {}
	FooBar(Foo&amp;&amp; foo, const Bar&amp; bar) : _foo(std::move(foo)), _bar(bar) {}
	FooBar(const Foo&amp; foo, Bar&amp;&amp; bar) : _foo(foo), _bar(std::move(bar)) {}
	FooBar(Foo&amp;&amp; foo, Bar&amp;&amp; bar) : _foo(std::move(foo)), _bar(std::move(bar)) {}

	Foo _foo;
	Bar _bar;
};

int main(void) {
	Foo foo1;
	Foo foo2;
	Bar bar1;
	Bar bar2;
	FooBar fooBar(foo1, bar1);
	FooBar fooBar1(std::move(foo1), bar1);
	FooBar fooBar2(foo2, std::move(bar1));
	FooBar fooBar3(std::move(foo2), std::move(bar2));
}
</code></pre>
<blockquote>
<p>copy Foo<br />
copy Bar<br />
move Foo<br />
copy Bar<br />
copy Foo<br />
move Bar<br />
move Foo<br />
move Bar</p>
</blockquote>
<p>Mit dieser Version brauch ich dafür immer (bezüglich Variablen-Anzahl) quadratisch viele Konstruktoren? Bei 2 Variablen ist es ja noch ok, aber bei 3 wirds schon nervig.</p>
<p>Kann man die Anzahl der Konstruktoren irgendwie reduzieren?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296072/flexibles-move-bzw-copy-von-variablen-bei-konstruktor-aufruf</link><generator>RSS for Node</generator><lastBuildDate>Sat, 15 Aug 2026 04:29:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296072.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Nov 2011 17:23:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to &#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf on Sun, 27 Nov 2011 17:23:30 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Klasse deren Konstruktor zwei Variablen übergeben kriegt.<br />
Falls die Variablen noch benötigt werden, soll der Copy-Constructor aufgerufen werden, sonst der Move-Constructor.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;

struct Foo{
	Foo(){}
	Foo(const Foo&amp;) { std::cout &lt;&lt; &quot;copy Foo&quot; &lt;&lt; std::endl;}
	Foo(Foo&amp;&amp;) { std::cout &lt;&lt; &quot;move Foo&quot; &lt;&lt; std::endl;}
};

struct Bar{
	Bar(){}
	Bar(const Bar&amp;) { std::cout &lt;&lt; &quot;copy Bar&quot; &lt;&lt; std::endl;}
	Bar(Bar&amp;&amp;) { std::cout &lt;&lt; &quot;move Bar&quot; &lt;&lt; std::endl;}
};

struct FooBar {
	FooBar(const Foo&amp; foo, const Bar&amp; bar) : _foo(foo), _bar(bar) {}
	FooBar(Foo&amp;&amp; foo, const Bar&amp; bar) : _foo(std::move(foo)), _bar(bar) {}
	FooBar(const Foo&amp; foo, Bar&amp;&amp; bar) : _foo(foo), _bar(std::move(bar)) {}
	FooBar(Foo&amp;&amp; foo, Bar&amp;&amp; bar) : _foo(std::move(foo)), _bar(std::move(bar)) {}

	Foo _foo;
	Bar _bar;
};

int main(void) {
	Foo foo1;
	Foo foo2;
	Bar bar1;
	Bar bar2;
	FooBar fooBar(foo1, bar1);
	FooBar fooBar1(std::move(foo1), bar1);
	FooBar fooBar2(foo2, std::move(bar1));
	FooBar fooBar3(std::move(foo2), std::move(bar2));
}
</code></pre>
<blockquote>
<p>copy Foo<br />
copy Bar<br />
move Foo<br />
copy Bar<br />
copy Foo<br />
move Bar<br />
move Foo<br />
move Bar</p>
</blockquote>
<p>Mit dieser Version brauch ich dafür immer (bezüglich Variablen-Anzahl) quadratisch viele Konstruktoren? Bei 2 Variablen ist es ja noch ok, aber bei 3 wirds schon nervig.</p>
<p>Kann man die Anzahl der Konstruktoren irgendwie reduzieren?</p>
<p>Gruß,<br />
XSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149647</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 27 Nov 2011 17:23:30 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf on Sun, 27 Nov 2011 17:38:54 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Mit dieser Version brauch ich dafür immer (bezüglich Variablen-Anzahl) quadratisch viele Konstruktoren? Bei 2 Variablen ist es ja noch ok, aber bei 3 wirds schon nervig.</p>
</blockquote>
<p>Quadratisch? Du brauchst 2<sup>n</sup>.</p>
<p>Meiner Erfahrung nach ist maximal ein Parameter move-Bedürftig, also war das bei mir noch nie ein Problem. Spielst du nur rum oder hast du das Problem tatsächlich?</p>
<p>In Fällen wo die Geschwindigkeit keine Rolle spielt kannst du einfach immer die const&amp;-Variante nehmen. Damit bist du noch genug flexibel, da neue &amp;&amp;-Überladungen nichts am Interface ändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149655</guid><dc:creator><![CDATA[reduktionskost]]></dc:creator><pubDate>Sun, 27 Nov 2011 17:38:54 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf on Sun, 27 Nov 2011 17:48:08 GMT]]></title><description><![CDATA[<p>Du kannst stumpf alles per Value erwarten und dann moven. Dann hast du entweder copy+move oder move+move, wenn du davon ausgehst dass die move-Kosten quasi gegen 0 gehen, ist das auch egal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149660</guid><dc:creator><![CDATA[cooky451]]></dc:creator><pubDate>Sun, 27 Nov 2011 17:48:08 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf on Sun, 27 Nov 2011 17:50:04 GMT]]></title><description><![CDATA[<p>reduktionskost schrieb:</p>
<blockquote>
<p>XSpille schrieb:</p>
<blockquote>
<p>Mit dieser Version brauch ich dafür immer (bezüglich Variablen-Anzahl) quadratisch viele Konstruktoren? Bei 2 Variablen ist es ja noch ok, aber bei 3 wirds schon nervig.</p>
</blockquote>
<p>Quadratisch? Du brauchst 2<sup>n</sup>.</p>
<p>Meiner Erfahrung nach ist maximal ein Parameter move-Bedürftig, also war das bei mir noch nie ein Problem. Spielst du nur rum oder hast du das Problem tatsächlich?</p>
<p>In Fällen wo die Geschwindigkeit keine Rolle spielt kannst du einfach immer die const&amp;-Variante nehmen. Damit bist du noch genug flexibel, da neue &amp;&amp;-Überladungen nichts am Interface ändern.</p>
</blockquote>
<p>Du hast natürlich recht... Ist ja sogar exponentiell...</p>
<p>Ich schreibe eine Template-Library, wo ich mir vorstellen könnte, dass beide Parameter zum Moven in Frage kommen können.<br />
Und deswegen habe ich es mir eher theoretisch überlegt, was man in so einem Fall machen kann, wenn er mehr Parameter würden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149661</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 27 Nov 2011 17:50:04 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf on Sun, 27 Nov 2011 17:51:39 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Du kannst stumpf alles per Value erwarten und dann moven. Dann hast du entweder copy+move oder move+move, wenn du davon ausgehst dass die move-Kosten quasi gegen 0 gehen, ist das auch egal.</p>
</blockquote>
<p>Genau das.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149662</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Sun, 27 Nov 2011 17:51:39 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf on Sun, 27 Nov 2011 18:09:37 GMT]]></title><description><![CDATA[<p>cooky451 schrieb:</p>
<blockquote>
<p>Du kannst stumpf alles per Value erwarten und dann moven. Dann hast du entweder copy+move oder move+move, wenn du davon ausgehst dass die move-Kosten quasi gegen 0 gehen, ist das auch egal.</p>
</blockquote>
<p><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/2149670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149670</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 27 Nov 2011 18:09:37 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf on Sun, 27 Nov 2011 18:16:37 GMT]]></title><description><![CDATA[<blockquote>
<p>Du kannst stumpf alles per Value erwarten und dann moven. Dann hast du entweder copy+move oder move+move, wenn du davon ausgehst dass die move-Kosten quasi gegen 0 gehen, ist das auch egal.</p>
</blockquote>
<p>Ich möchte auch ausdrücken dass ich das so gemacht hätte, da ich wichtig bin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149673</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149673</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Sun, 27 Nov 2011 18:16:37 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf on Sun, 27 Nov 2011 18:46:19 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;type_traits&gt;
#include &lt;utility&gt;

struct Foo{
    Foo(){}
    Foo(const Foo&amp;) { std::cout &lt;&lt; &quot;copy Foo&quot; &lt;&lt; std::endl;}
    Foo(Foo&amp;&amp;) { std::cout &lt;&lt; &quot;move Foo&quot; &lt;&lt; std::endl;}
};

struct Bar{
    Bar(){}
    Bar(const Bar&amp;) { std::cout &lt;&lt; &quot;copy Bar&quot; &lt;&lt; std::endl;}
    Bar(Bar&amp;&amp;) { std::cout &lt;&lt; &quot;move Bar&quot; &lt;&lt; std::endl;}
};

struct FooBar {
    template &lt;typename T, typename U,
              typename = typename std::enable_if&lt;std::is_convertible&lt;T, Foo&gt;::value
                                              &amp;&amp; std::is_convertible&lt;U, Bar&gt;::value&gt;::type&gt;
    FooBar(T&amp;&amp; foo, U&amp;&amp; bar) : _foo(std::forward&lt;T&gt;(foo)), _bar(std::forward&lt;U&gt;(bar)) {}

    Foo _foo;
    Bar _bar;
};

int main(void) {
    Foo foo1;
    Foo foo2;
    Bar bar1;
    Bar bar2;
    FooBar fooBar(foo1, bar1);
    FooBar fooBar1(std::move(foo1), bar1);
    FooBar fooBar2(foo2, std::move(bar1));
    FooBar fooBar3(std::move(foo2), std::move(bar2));
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2149683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149683</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 27 Nov 2011 18:46:19 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf on Sun, 27 Nov 2011 19:29:04 GMT]]></title><description><![CDATA[<p>Danke camper!</p>
<p>Ich finds geil <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>
<p>Allerdings verstehe ich noch nicht, warum es funktioniert.<br />
Wieso passen denn die Parameter ohne std::move für die erwartete rvalue-Referenz?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149698</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149698</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 27 Nov 2011 19:29:04 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf on Sun, 27 Nov 2011 19:45:57 GMT]]></title><description><![CDATA[<p>XSpille schrieb:</p>
<blockquote>
<p>Danke camper!</p>
<p>Ich finds geil <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>
<p>Allerdings verstehe ich noch nicht, warum es funktioniert.<br />
Wieso passen denn die Parameter ohne std::move für die erwartete rvalue-Referenz?</p>
</blockquote>
<p>Stichwort reference collapsing. Der Parameter wird dann z.B. als Foo&amp; erkannt, zusammen gibt das dann Foo&amp; &amp;&amp;, was wieder zu Foo&amp; geschrumpft wird. Übergibst du ein rvalue, ist der Typ Foo&amp;&amp; und der gesamte Parameter Foo&amp;&amp; &amp;&amp;, was zu Foo&amp;&amp; geschrumpft wird. Stichwort perfect forwarding.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2149702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149702</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 27 Nov 2011 19:45:57 GMT</pubDate></item><item><title><![CDATA[Reply to &#x27;Flexibles&#x27; move bzw. copy von Variablen bei Konstruktor-Aufruf on Sun, 27 Nov 2011 19:58:04 GMT]]></title><description><![CDATA[<p><code>reference collapsing</code> ist genau das Stichwort, das ich brauchte <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>
<p>thx <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/2149707</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2149707</guid><dc:creator><![CDATA[XSpille]]></dc:creator><pubDate>Sun, 27 Nov 2011 19:58:04 GMT</pubDate></item></channel></rss>