<?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::bind nicht kompatibel mit movable-only types?]]></title><description><![CDATA[<p>Eigentlich selbsterklärend...</p>
<pre><code class="language-cpp">#include &lt;functional&gt;

struct movable_only
{
        movable_only() = default;

        movable_only(movable_only const&amp;) = delete;
        movable_only&amp; operator = (movable_only const&amp;) = delete;

        movable_only(movable_only&amp;&amp;) {}
        movable_only&amp; operator = (movable_only&amp;&amp;) {}
};

void f(movable_only m)
{}

int main()
{
        movable_only a;
        auto fun = std::bind(f, std::move(a));
        fun();
}
</code></pre>
<p><a href="http://ideone.com/1anmF" rel="nofollow">http://ideone.com/1anmF</a><br />
Warum klappts nicht? Was kann ich tun?</p>
<p>Grüßle,<br />
PI</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/296456/std-bind-nicht-kompatibel-mit-movable-only-types</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 21:51:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/296456.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Dec 2011 09:14:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::bind nicht kompatibel mit movable-only types? on Mon, 05 Dec 2011 09:14:20 GMT]]></title><description><![CDATA[<p>Eigentlich selbsterklärend...</p>
<pre><code class="language-cpp">#include &lt;functional&gt;

struct movable_only
{
        movable_only() = default;

        movable_only(movable_only const&amp;) = delete;
        movable_only&amp; operator = (movable_only const&amp;) = delete;

        movable_only(movable_only&amp;&amp;) {}
        movable_only&amp; operator = (movable_only&amp;&amp;) {}
};

void f(movable_only m)
{}

int main()
{
        movable_only a;
        auto fun = std::bind(f, std::move(a));
        fun();
}
</code></pre>
<p><a href="http://ideone.com/1anmF" rel="nofollow">http://ideone.com/1anmF</a><br />
Warum klappts nicht? Was kann ich tun?</p>
<p>Grüßle,<br />
PI</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153161</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 05 Dec 2011 09:14:20 GMT</pubDate></item><item><title><![CDATA[Reply to std::bind nicht kompatibel mit movable-only types? on Mon, 05 Dec 2011 09:30:44 GMT]]></title><description><![CDATA[<p>funktioniert das hier?</p>
<pre><code class="language-cpp">int main()
{
        movable_only a;
        f(a);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2153169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153169</guid><dc:creator><![CDATA[__cu]]></dc:creator><pubDate>Mon, 05 Dec 2011 09:30:44 GMT</pubDate></item><item><title><![CDATA[Reply to std::bind nicht kompatibel mit movable-only types? on Mon, 05 Dec 2011 09:33:27 GMT]]></title><description><![CDATA[<p>Wenn du darauf hinaus willst, dass ich als Parameter eine Referenz verwenden soll: Nein, das kompiliert ebenfalls nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153171</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 05 Dec 2011 09:33:27 GMT</pubDate></item><item><title><![CDATA[Reply to std::bind nicht kompatibel mit movable-only types? on Mon, 05 Dec 2011 09:50:16 GMT]]></title><description><![CDATA[<p>Der originale Code kann gar nicht funktionieren. __cu hat durch sein Beispiel darauf hingewiesen, denn std::bind benutzt kein std::forward oder std::move, um die Parameter weiterzuleiten.</p>
<p>Davon abgesehen, hätte ich erwartet, dass es mit einer Funktion wie dieser:</p>
<pre><code class="language-cpp">void f(movable_only const&amp; m)
{}
</code></pre>
<p>hätte funktionieren müssen (vielleicht sogar ohne const, bin mir da aber gerade nicht sicher). Welchen Compiler in welcher Version hast Du verwendet?</p>
<p>Cheers!<br />
k.k.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153181</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153181</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 05 Dec 2011 09:50:16 GMT</pubDate></item><item><title><![CDATA[Reply to std::bind nicht kompatibel mit movable-only types? on Mon, 05 Dec 2011 10:10:48 GMT]]></title><description><![CDATA[<p>GCC 4.6.1 <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 />
Funktioniert weder mit ref, noch mit const-ref. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153192</guid><dc:creator><![CDATA[314159265358979]]></dc:creator><pubDate>Mon, 05 Dec 2011 10:10:48 GMT</pubDate></item><item><title><![CDATA[Reply to std::bind nicht kompatibel mit movable-only types? on Mon, 05 Dec 2011 10:11:56 GMT]]></title><description><![CDATA[<p>Mit dem g++ 4.7.0 (20111112) funktioniert es mit der Referenz. (auch ohne const).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153193</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153193</guid><dc:creator><![CDATA[__cu]]></dc:creator><pubDate>Mon, 05 Dec 2011 10:11:56 GMT</pubDate></item><item><title><![CDATA[Reply to std::bind nicht kompatibel mit movable-only types? on Mon, 05 Dec 2011 10:16:48 GMT]]></title><description><![CDATA[<p>Soll a hier einmal in den Binder gemoved und bei jedem Aufruf von fun dann kopiert werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153195</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153195</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Mon, 05 Dec 2011 10:16:48 GMT</pubDate></item><item><title><![CDATA[Reply to std::bind nicht kompatibel mit movable-only types? on Mon, 05 Dec 2011 11:47:33 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int main()
{
        movable_only a;
        auto fun = std::bind(f, std::move(a)); // der move in den binder funktioniert
        fun();                                 // aber wenn hier &quot;gemovt&quot; wird     
        fun();                                 // ?
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2153237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153237</guid><dc:creator><![CDATA[__cu]]></dc:creator><pubDate>Mon, 05 Dec 2011 11:47:33 GMT</pubDate></item><item><title><![CDATA[Reply to std::bind nicht kompatibel mit movable-only types? on Mon, 05 Dec 2011 12:02:07 GMT]]></title><description><![CDATA[<p>Eigentlich bräuchte man so etwas:</p>
<pre><code class="language-cpp">std::move(fun)();
</code></pre>
<p>Das bedingt allerdings folgende Spracherweiterung:</p>
<pre><code class="language-cpp">class foo {
  void bar();       // normal
  void bar() const; // constant
  void bar() &amp;&amp;;    // destructive
};
</code></pre>
<p>Auf den ersten Blick (und genauer habe ich das nicht bedacht) ist das gar nicht so sinnlos.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153249</guid><dc:creator><![CDATA[destructivus]]></dc:creator><pubDate>Mon, 05 Dec 2011 12:02:07 GMT</pubDate></item><item><title><![CDATA[Reply to std::bind nicht kompatibel mit movable-only types? on Mon, 05 Dec 2011 12:18:51 GMT]]></title><description><![CDATA[<p>destructivus schrieb:</p>
<blockquote>
<p>Eigentlich bräuchte man so etwas:</p>
<pre><code class="language-cpp">std::move(fun)();
</code></pre>
</blockquote>
<p>Das gefällt mir!</p>
<p>destructivus schrieb:</p>
<blockquote>
<p>Das bedingt allerdings folgende Spracherweiterung:</p>
<pre><code class="language-cpp">class foo {
  void bar();       // normal
  void bar() const; // constant
  void bar() &amp;&amp;;    // destructive
};
</code></pre>
<p>Auf den ersten Blick (und genauer habe ich das nicht bedacht) ist das gar nicht so sinnlos.</p>
</blockquote>
<p>Naja, das ist nicht ganz richtig so mit der Überladung (sie ist illegal). Entweder ist ein Ref-Qualifier überall dabei oder eben nirgens. Korrekt wäre:</p>
<pre><code class="language-cpp">class some_binder {
  :::
  result_type operator()(...) &amp;;
  result_type operator()(...) const&amp;;
  result_type operator()(...) &amp;&amp;;
  :::
};
</code></pre>
<p>Die Semantik im Falle von Ref-Qualifiers ist dieselbe, die man bei &quot;normalen&quot; Parametern des entsprechenden Typs auch hat bzgl Überladung:</p>
<pre><code class="language-cpp">void foo(bar      &amp; self);
void foo(bar const&amp; self);
void foo(bar     &amp;&amp; self);
</code></pre>
<p>clang unterstützt das mit den ref-qualifiers inzwischen angeblich.</p>
<p>Ja, so könnte man im letzten Overload die gebundenen Parameter beim Aufruf der &quot;inneren Funktion&quot; auch zu Rvalues casten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153254</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 05 Dec 2011 12:18:51 GMT</pubDate></item><item><title><![CDATA[Reply to std::bind nicht kompatibel mit movable-only types? on Mon, 05 Dec 2011 12:23:25 GMT]]></title><description><![CDATA[<p>destructivus schrieb:</p>
<blockquote>
<p>Das bedingt allerdings folgende Spracherweiterung:</p>
<pre><code class="language-cpp">class foo {
  void bar();       // normal
  void bar() const; // constant
  void bar() &amp;&amp;;    // destructive
};
</code></pre>
<p>Auf den ersten Blick (und genauer habe ich das nicht bedacht) ist das gar nicht so sinnlos.</p>
</blockquote>
<p>Auch auf den zweiten nicht. Aus dem Grund gibts das Feature auch in C++0x. Meines Wissens wirds aber von MSVC und gcc noch nicht unterstützt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2153256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2153256</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 05 Dec 2011 12:23:25 GMT</pubDate></item></channel></rss>