<?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[Verwirrung mit move-Constructor und std::thread]]></title><description><![CDATA[<p>Servus,</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;thread&gt;

class A
{
public:
	A()
	{

	}

	A(A const &amp;rhs)
	{
		std::cout &lt;&lt; &quot;A(A const &amp;rhs)\n&quot;;
	}

	A(A&amp;&amp; rhs)
	{
		std::cout &lt;&lt; &quot;A(A&amp;&amp; rhs)\n&quot;;
	}
};

void foo(A a)
{
	std::cout &lt;&lt; &quot;foo()\n&quot;;
}

int main()
{
	A a;

	std::thread t(&amp;foo, std::move(a));
	t.join();

	return 0;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>A(A&amp;&amp; rhs)
A(A&amp;&amp; rhs)
A(A&amp;&amp; rhs)
A(A&amp;&amp; rhs)
A(A const &amp;rhs)
foo()
</code></pre>
<ol>
<li>Wieso wird der move-Konstruktor 4mal aufgerufen?</li>
<li>Wieso wird der copy-Konstruktor aufgerufen? Wie kann ich das verhindern?</li>
</ol>
<p>Schonmal danke ..</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/324137/verwirrung-mit-move-constructor-und-std-thread</link><generator>RSS for Node</generator><lastBuildDate>Tue, 14 Jul 2026 20:26:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/324137.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 04 Mar 2014 15:46:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verwirrung mit move-Constructor und std::thread on Tue, 04 Mar 2014 15:46:25 GMT]]></title><description><![CDATA[<p>Servus,</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;thread&gt;

class A
{
public:
	A()
	{

	}

	A(A const &amp;rhs)
	{
		std::cout &lt;&lt; &quot;A(A const &amp;rhs)\n&quot;;
	}

	A(A&amp;&amp; rhs)
	{
		std::cout &lt;&lt; &quot;A(A&amp;&amp; rhs)\n&quot;;
	}
};

void foo(A a)
{
	std::cout &lt;&lt; &quot;foo()\n&quot;;
}

int main()
{
	A a;

	std::thread t(&amp;foo, std::move(a));
	t.join();

	return 0;
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>A(A&amp;&amp; rhs)
A(A&amp;&amp; rhs)
A(A&amp;&amp; rhs)
A(A&amp;&amp; rhs)
A(A const &amp;rhs)
foo()
</code></pre>
<ol>
<li>Wieso wird der move-Konstruktor 4mal aufgerufen?</li>
<li>Wieso wird der copy-Konstruktor aufgerufen? Wie kann ich das verhindern?</li>
</ol>
<p>Schonmal danke ..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386549</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386549</guid><dc:creator><![CDATA[astktzukzkzukl]]></dc:creator><pubDate>Tue, 04 Mar 2014 15:46:25 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung mit move-Constructor und std::thread on Tue, 04 Mar 2014 15:49:01 GMT]]></title><description><![CDATA[<p>@2) Der simpelste Weg, das verhindern wäre ihn zu deleten (oder halt zu verstecken/nicht implementieren)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386550</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 04 Mar 2014 15:49:01 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung mit move-Constructor und std::thread on Tue, 04 Mar 2014 15:58:04 GMT]]></title><description><![CDATA[<p>Wenn ich das mache bekomme ich einen Fehler vom Compiler. Was aber eigentlich auch logisch ist, da foo() den Paramater by-value nimmt und nicht der dazugehörige Copy-constructor gefunden werden kann, oder?</p>
<p>Dann verstehe ich aber nicht mehr den Sinn von der move-Semantik, und erst recht nicht wieso der Move-constructor 4mal vorher aufgerufen wird ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386552</guid><dc:creator><![CDATA[astktzukzkzukl]]></dc:creator><pubDate>Tue, 04 Mar 2014 15:58:04 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung mit move-Constructor und std::thread on Tue, 04 Mar 2014 17:16:31 GMT]]></title><description><![CDATA[<p>std::forward, std::ref und std::cref sind deine Freunde.<br />
Edit: Doch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386578</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386578</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Tue, 04 Mar 2014 17:16:31 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung mit move-Constructor und std::thread on Tue, 04 Mar 2014 17:21:50 GMT]]></title><description><![CDATA[<blockquote>
<pre><code>A(A&amp;&amp; rhs)
A(A&amp;&amp; rhs)
A(A&amp;&amp; rhs)
A(A&amp;&amp; rhs)
A(A const &amp;rhs)
foo()
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Dein Compiler unterstützt C++11 noch nicht ganz. Den Kopierkonstruktor hier aufzurufen ist gar nicht erlaubt, der Typ könnte ja Move-Only sein.</p>
<p>Der GCC gibt hier aus:</p>
<pre><code>A(A&amp;&amp; rhs)
A(A&amp;&amp; rhs)
A(A&amp;&amp; rhs)
foo()
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2386582</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386582</guid><dc:creator><![CDATA[htasaed]]></dc:creator><pubDate>Tue, 04 Mar 2014 17:21:50 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung mit move-Constructor und std::thread on Tue, 04 Mar 2014 17:27:58 GMT]]></title><description><![CDATA[<p>Und der dreimalige Aufruf des Move-Konstruktors liegen an der GCC-Implementierung von std::thread.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386583</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386583</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 04 Mar 2014 17:27:58 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung mit move-Constructor und std::thread on Tue, 04 Mar 2014 17:32:31 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Und der dreimalige Aufruf des Move-Konstruktors liegen an der GCC-Implementierung von std::thread.</p>
</blockquote>
<p>Wieso es genau drei sind verstehe ich nicht.</p>
<p>Eigentlich brauchts doch nur 2: 1x move um A in std::thread zu speichern und 1x um Foo aufzurufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386585</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386585</guid><dc:creator><![CDATA[htasaed]]></dc:creator><pubDate>Tue, 04 Mar 2014 17:32:31 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung mit move-Constructor und std::thread on Tue, 04 Mar 2014 17:40:45 GMT]]></title><description><![CDATA[<p>Ok, das würde es erklären.<br />
Ich benutze Visual Studio 2013 Professional, ich dachte der Compiler würde das mittlerweile unterstützen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386587</guid><dc:creator><![CDATA[astktzukzkzukl]]></dc:creator><pubDate>Tue, 04 Mar 2014 17:40:45 GMT</pubDate></item><item><title><![CDATA[Reply to Verwirrung mit move-Constructor und std::thread on Tue, 04 Mar 2014 17:44:43 GMT]]></title><description><![CDATA[<p>htasaed schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Und der dreimalige Aufruf des Move-Konstruktors liegen an der GCC-Implementierung von std::thread.</p>
</blockquote>
<p>Wieso es genau drei sind verstehe ich nicht.</p>
<p>Eigentlich brauchts doch nur 2: 1x move um A in std::thread zu speichern und 1x um Foo aufzurufen.</p>
</blockquote>
<p>Soweit ich jetzt auf die Schnelle den Sourecode verstehe:<br />
Der Konstruktor ruft std::__bind_simple mit den Argumenten auf.<br />
std::__bind_simple erzeugt ein Objekt was vom Typ std::_Bind_simple ist.<br />
std::_Bind_simple speichert die Argumente und den Funktionspointer in einem tuple, daher wohl der zusätzliche move.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2386590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2386590</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 04 Mar 2014 17:44:43 GMT</pubDate></item></channel></rss>