<?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[std::forward oder std::move: Ich komm durcheinander]]></title><description><![CDATA[<p>Hallo.</p>
<pre><code class="language-cpp">smart_union(T&amp;&amp; value){
        set_first(std::move(value));
    }
</code></pre>
<p>Für set_first gibt es zwei Funktionen. Einmal set_first(const T&amp; ) und einmal set_first(T&amp;&amp; ). Muss ich nun bei set_first() std::move() oder std::forward() machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339017/std-forward-oder-std-move-ich-komm-durcheinander</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Apr 2026 13:09:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339017.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Jul 2016 19:51:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::forward oder std::move: Ich komm durcheinander on Wed, 27 Jul 2016 19:51:51 GMT]]></title><description><![CDATA[<p>Hallo.</p>
<pre><code class="language-cpp">smart_union(T&amp;&amp; value){
        set_first(std::move(value));
    }
</code></pre>
<p>Für set_first gibt es zwei Funktionen. Einmal set_first(const T&amp; ) und einmal set_first(T&amp;&amp; ). Muss ich nun bei set_first() std::move() oder std::forward() machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2503721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503721</guid><dc:creator><![CDATA[Hallo!]]></dc:creator><pubDate>Wed, 27 Jul 2016 19:51:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::forward oder std::move: Ich komm durcheinander on Wed, 27 Jul 2016 20:30:19 GMT]]></title><description><![CDATA[<p>Du kannst es dir so merken: move ist ein Cast, der dir immer eine Rvalue-Referenz liefert. forward ist ein bedingter Cast, der Lvalue Lvalue und Rvalue Rvalue sein lässt. In deinem Fall ist vermutlich forward die richtige Wahl, da es sich bei value wohl um eine Universal Reference handelt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2503729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503729</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Wed, 27 Jul 2016 20:30:19 GMT</pubDate></item><item><title><![CDATA[Reply to std::forward oder std::move: Ich komm durcheinander on Wed, 27 Jul 2016 20:39:10 GMT]]></title><description><![CDATA[<p>Jodocus schrieb:</p>
<blockquote>
<p>In deinem Fall ist vermutlich forward die richtige Wahl, da es sich bei value wohl um eine Universal Reference handelt.</p>
</blockquote>
<p>Hm, bist du dir sicher? Klar, es ist ein</p>
<pre><code class="language-cpp">template&lt;typename T, typename U&gt;
class smart_union { ... };
</code></pre>
<p>aber sowas wie</p>
<pre><code class="language-cpp">smart_union&lt;int&amp;, std::string&gt; inst;
</code></pre>
<p>wird nicht vorkommen können.</p>
<p>Und ich hab auch zwei Versionen des Konstruktors. Einmal konstante Referenz, einmal für die Move Semantics.</p>
<p>Und ich hab folgendes getestet:</p>
<pre><code class="language-cpp">int&amp;&amp; x = 10;
int&amp;&amp; y = std::move(x); // std::move() muss man explizit mit angeben, sonst kompilierts nicht
</code></pre>
<p>Und das funktioniert einwandfrei und ruft auch keinen Konstruktor auf.</p>
<p>Also denke ich wohl eher, dass std::move() doch die richtige Wahl war?<br />
Oder was versteh ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2503730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503730</guid><dc:creator><![CDATA[Hallo!]]></dc:creator><pubDate>Wed, 27 Jul 2016 20:39:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::forward oder std::move: Ich komm durcheinander on Wed, 27 Jul 2016 21:03:45 GMT]]></title><description><![CDATA[<p>Hallo! schrieb:</p>
<blockquote>
<p>Jodocus schrieb:</p>
<blockquote>
<p>In deinem Fall ist vermutlich forward die richtige Wahl, da es sich bei value wohl um eine Universal Reference handelt.</p>
</blockquote>
<p>Hm, bist du dir sicher?</p>
</blockquote>
<p>Nö, ich kenne deinen Code ja nicht. <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="😉"
    /> In deinem Fall würde ich evtl. statt den Konstruktor zu überladen ihm selbst zu einem Template mit Universal-Reference machen und dann perfect forwarden:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct foo {
    template &lt;typename U&gt; foo(U&amp;&amp; param) : set_first(std::forward&lt;U&gt;(param)) { }
    ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2503732</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503732</guid><dc:creator><![CDATA[Jodocus]]></dc:creator><pubDate>Wed, 27 Jul 2016 21:03:45 GMT</pubDate></item><item><title><![CDATA[Reply to std::forward oder std::move: Ich komm durcheinander on Wed, 27 Jul 2016 21:09:23 GMT]]></title><description><![CDATA[<p><a href="https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers" rel="nofollow">https://isocpp.org/blog/2012/11/universal-references-in-c11-scott-meyers</a></p>
<p><a href="https://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Scott-Meyers-Universal-References-in-Cpp11" rel="nofollow">https://channel9.msdn.com/Shows/Going+Deep/Cpp-and-Beyond-2012-Scott-Meyers-Universal-References-in-Cpp11</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2503733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503733</guid><dc:creator><![CDATA[5cript]]></dc:creator><pubDate>Wed, 27 Jul 2016 21:09:23 GMT</pubDate></item><item><title><![CDATA[Reply to std::forward oder std::move: Ich komm durcheinander on Wed, 27 Jul 2016 23:15:49 GMT]]></title><description><![CDATA[<p>Ok, danke euch.</p>
<p>Wenn ich das also richtig verstanden habe, gibt es universal references und rvalue references. Und universal references zu benutzen resultiert in weniger Code schreiben, als wie von mir gepostet. Falsch war mein Beispiel also nicht.</p>
<p>Nadann benutz ich Universal references!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2503740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503740</guid><dc:creator><![CDATA[Hallo!]]></dc:creator><pubDate>Wed, 27 Jul 2016 23:15:49 GMT</pubDate></item><item><title><![CDATA[Reply to std::forward oder std::move: Ich komm durcheinander on Wed, 27 Jul 2016 23:40:52 GMT]]></title><description><![CDATA[<p>Moment mal, kurz ein anderes Thema. Warum kompiliert das nicht, wenn man eine Klasse instanzieren möchte:</p>
<pre><code class="language-cpp">template&lt;typename X, typename = typename std::enable_if&lt;std::is_same&lt;typename std::decay&lt;X&gt;::type, T&gt;::value&gt;::type&gt;
    smart_union(X&amp;&amp; value){
        set_first(std::forward&lt;X&gt;(value));
    }

    template&lt;typename X, typename = typename std::enable_if&lt;std::is_same&lt;typename std::decay&lt;X&gt;::type, U&gt;::value&gt;::type&gt;
    smart_union(X&amp;&amp; value){
        set_second(std::forward&lt;X&gt;(value));
    }
</code></pre>
<p>Für die Konstruktoren zumindest muss ich wohl die andere Variante beibehalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2503741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503741</guid><dc:creator><![CDATA[Hallo!]]></dc:creator><pubDate>Wed, 27 Jul 2016 23:40:52 GMT</pubDate></item><item><title><![CDATA[Reply to std::forward oder std::move: Ich komm durcheinander on Wed, 27 Jul 2016 23:50:46 GMT]]></title><description><![CDATA[<p>Nein, warte!</p>
<p>T&amp;&amp; und U&amp;&amp; sind doch IMHO schon universal references. Die weiteren Template-Parameter sind unnütz.</p>
<p>Ich glaub ich habs verstanden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2503742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503742</guid><dc:creator><![CDATA[Hallo!]]></dc:creator><pubDate>Wed, 27 Jul 2016 23:50:46 GMT</pubDate></item><item><title><![CDATA[Reply to std::forward oder std::move: Ich komm durcheinander on Wed, 27 Jul 2016 23:56:43 GMT]]></title><description><![CDATA[<p>Ah, nein, es sind keine Universal references. Aber warum nicht?</p>
<p>Scott Meyers schrieb:</p>
<blockquote>
<p>If a variable or parameter is declared to have type T&amp;&amp; for some deduced type T, that variable or parameter is a universal reference.</p>
</blockquote>
<p>T und U sind doch zwei Template Parameter die deduktiert werden, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2503743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2503743</guid><dc:creator><![CDATA[Hello!]]></dc:creator><pubDate>Wed, 27 Jul 2016 23:56:43 GMT</pubDate></item></channel></rss>