<?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[Capture-Regeln bei Lambda-Funktionen]]></title><description><![CDATA[<p>Mir ist gerade erst klar geworden, daß die Capture-Regeln bei Lambda-Funktionen ziemlich einschränkend sind.</p>
<ul>
<li>Es ist nicht möglich, so etwas wie einen lokalen std::auto_ptr&lt;&gt; korrekt zu referenzieren:</li>
</ul>
<pre><code class="language-cpp">std::function&lt;int (int)&gt; Myself::func (void)
{
    std::auto_ptr&lt;MyClass&gt; myObj (new MyClass);
    auto result = [] (int x) { return myObj-&gt;foo (x); };
    myObj-&gt;someFurtherUsage ();
    return result;
}
</code></pre>
<p>Wenn ich <code>[=]</code> benutze, stolpere ich über die bekannten Probleme von std::auto_ptr&lt;&gt; mit Zuweisungen; hingegen <code>[&amp;]</code> zu benutzen ist bei lokalen Variablen schlicht töricht.</p>
<ul>
<li>Da <em>capture by reference</em> für Locals nicht sinnvoll ist, kann ich auch nicht zwei Lambda-Funktionen haben, die sich gemeinsam auf eine lokale Variable beziehen, also etwa sowas:</li>
</ul>
<pre><code class="language-cpp">void Myself::setUpCounters (void)
{
    int count = 0;
    this-&gt;setCounter ([] (void) { return ++count; });
    this-&gt;someOtherObject-&gt;setCounter ([] (void) { return ++count; });
}
</code></pre>
<p>Entweder mache ich das <em>by value</em> - dann habe ich zwei verschiedene Zähler -, oder ich verwende <em>by reference</em> und produziere Stack-Korruption.</p>
<p>Oder sehe ich das falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/292027/capture-regeln-bei-lambda-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 07:33:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/292027.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Sep 2011 11:37:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 11:37:34 GMT]]></title><description><![CDATA[<p>Mir ist gerade erst klar geworden, daß die Capture-Regeln bei Lambda-Funktionen ziemlich einschränkend sind.</p>
<ul>
<li>Es ist nicht möglich, so etwas wie einen lokalen std::auto_ptr&lt;&gt; korrekt zu referenzieren:</li>
</ul>
<pre><code class="language-cpp">std::function&lt;int (int)&gt; Myself::func (void)
{
    std::auto_ptr&lt;MyClass&gt; myObj (new MyClass);
    auto result = [] (int x) { return myObj-&gt;foo (x); };
    myObj-&gt;someFurtherUsage ();
    return result;
}
</code></pre>
<p>Wenn ich <code>[=]</code> benutze, stolpere ich über die bekannten Probleme von std::auto_ptr&lt;&gt; mit Zuweisungen; hingegen <code>[&amp;]</code> zu benutzen ist bei lokalen Variablen schlicht töricht.</p>
<ul>
<li>Da <em>capture by reference</em> für Locals nicht sinnvoll ist, kann ich auch nicht zwei Lambda-Funktionen haben, die sich gemeinsam auf eine lokale Variable beziehen, also etwa sowas:</li>
</ul>
<pre><code class="language-cpp">void Myself::setUpCounters (void)
{
    int count = 0;
    this-&gt;setCounter ([] (void) { return ++count; });
    this-&gt;someOtherObject-&gt;setCounter ([] (void) { return ++count; });
}
</code></pre>
<p>Entweder mache ich das <em>by value</em> - dann habe ich zwei verschiedene Zähler -, oder ich verwende <em>by reference</em> und produziere Stack-Korruption.</p>
<p>Oder sehe ich das falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113374</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Thu, 01 Sep 2011 11:37:34 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 11:58:03 GMT]]></title><description><![CDATA[<p>Was hättest du dir erwartet, und wie meinst du sollte/könnte eine Umsetzung davon aussehen?</p>
<p>Nachdem C++ (die Core-Language) keinerlei GC oder andere automatische Speicherverwaltung hat mit der shared ownership möglich wäre...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113391</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 01 Sep 2011 11:58:03 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 12:03:29 GMT]]></title><description><![CDATA[<p>Dafür gibt es std::shared_ptr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113399</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 01 Sep 2011 12:03:29 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 12:45:17 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>Was hättest du dir erwarte</p>
</blockquote>
<p>&quot;Capture by lifetime&quot;. Ein lokales Symbol lebt so lange, bis keine Lambda-Funktion mehr darauf verweist.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>und wie meinst du sollte/könnte eine Umsetzung davon aussehen?</p>
</blockquote>
<p>Z.B., indem Stack-Variablen, die von einem &quot;lifetime capture&quot; erfaßt werden, nicht auf dem Stack, sondern auf dem Heap angelegt werden. Speicherverwaltung z.B. via Referenzzählung; beim Eintritt in die Methode wird der Heap-Speicherplatz angelegt, beim Verabschieden der letzten Lambda-Funktion aus diesem Scope wird er wieder freigegeben.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Nachdem C++ (die Core-Language) keinerlei GC oder andere automatische Speicherverwaltung hat mit der shared ownership möglich wäre...</p>
</blockquote>
<p>Referenzzählung geht immer, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113427</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Thu, 01 Sep 2011 12:45:17 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 13:04:31 GMT]]></title><description><![CDATA[<p>Das &quot;ziemlich eingeschränkt&quot; kann ich in Deinen Beispielen nicht erkennen. Ich sehe da nur Benutzerfehler. Wenn man in C++ Indirektion haben will, muss man das sagen. Das ist hier nicht anders. Wenn sich Funktionsobjekte irgendwelche Zustände teilen sollen, schreit das nach shared_ptr:</p>
<pre><code class="language-cpp">auto sp = make_shared&lt;dings&gt;(...);
... [sp](int x){ ... sp-&gt;daten ...} ...
</code></pre>
<p>Du kannst Dich ja für mehr Syntaxzucker stark machen und vorschlagen, wie man das mit dem shared_ptr abkürzen können soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113433</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113433</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 01 Sep 2011 13:04:31 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 13:13:29 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Wenn man in C++ Indirektion haben will, muss man das sagen.</p>
</blockquote>
<p>Ja, das ist mir auch klar, daß ich das mit Smart-Pointern immer erzwingen kann. Ich wollte nur wissen, ob ich die Capturing-Möglichkeiten recht verstehe.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Du kannst Dich ja für mehr Syntaxzucker stark machen und vorschlagen, wie man das mit dem shared_ptr abkürzen können soll.</p>
</blockquote>
<p><code>[@]</code> aka <em>capture by lifetime/location</em> zusätzlich zu <code>[=]</code> und <code>[&amp;]</code> einführen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113446</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113446</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Thu, 01 Sep 2011 13:13:29 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 13:22:50 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Was hättest du dir erwarte</p>
</blockquote>
<p>&quot;Capture by lifetime&quot;. Ein lokales Symbol lebt so lange, bis keine Lambda-Funktion mehr darauf verweist.</p>
</blockquote>
<p>Da wären wir wieder bei &quot;C++ hat keine echten Closures&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113447</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113447</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 01 Sep 2011 13:22:50 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 13:26:07 GMT]]></title><description><![CDATA[<p>Das ist dann aber nicht einfach nur ein capture, sondern verändert die Semantik vorhergehenden Codes. Wie man das mit überladenen operator new und operator delete in Einklang bringen soll, ist nicht trivial. Interessant auch die Frage, wie</p>
<pre><code class="language-cpp">std::function&lt;void()&gt; foo(my_type x) {
  return [@]() { x.foo(); }
}
</code></pre>
<p>verarbeitet werden sollte - der aufrufende Code hätte ja keine Ahnung, dass er die Parameter auf den Heap legen muss.</p>
<p>Wenn du referenzgezählte Heap-Variablen haben willst, ist std::auto_ptr stumpf die falsche Wahl. Ich halte das ehrlich gesagt nicht für ein Problem, und dein Vorschlag würde ohne erkennbaren Gewinn eine Reihe echter Probleme einführen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113450</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Thu, 01 Sep 2011 13:26:07 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 13:32:42 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Du kannst Dich ja für mehr Syntaxzucker stark machen und vorschlagen, wie man das mit dem shared_ptr abkürzen können soll.</p>
</blockquote>
<p><code>[@]</code> aka <em>capture by lifetime/location</em> zusätzlich zu <code>[=]</code> und <code>[&amp;]</code> einführen.</p>
</blockquote>
<p>Das @ gehört leider nicht zum source code character set. Bitte denke den Vorschlag auch zu Ende. Du musst ja nicht gleich etwas druckreifes abgeben, aber ein bissel mehr Gedanken solltest Du Dir schon gemacht haben. Gibt es vielleicht Einschränkungen darüber, auf welche Variablen man sich da beziehen kann? Wann/wie/wo soll sollen Variablen auf'm Heap angelegt werden? Sollen die schon vorher dort leben. Sollen die kopiert werden beim Erzeugen des Funktionsobjekts? Erzähl mal, was das genau für ein Programmverhalten da sein soll in so einer Situation...</p>
<p>Das Problem scheint zu sein, dass Du das &quot;Closure-Verhalten&quot; einer anderen Sprache, nachahmen willst, die aber völlig anders funktioniert. Ich denke da jetzt mal an Python als Beispiel. Da leben Alle Objekte sowieso im Heap und werden &quot;referenzgezählt&quot;. Da kann man an das Funktionsobjekt ohne Probleme alle möglichen Referenzen dranhängen. So funktioniert C++ aber nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113452</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 01 Sep 2011 13:32:42 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 13:47:42 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Da wären wir wieder bei &quot;C++ hat keine echten Closures&quot;.</p>
</blockquote>
<p>&quot;Echte Closures&quot; aus &quot;echten Sprachen&quot; werden hinter'm Vorhang mit shared_ptrs implementiert. <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="🤡"
    /></p>
<p>Nenn' es wie Du willst ... &quot;C++ closures&quot; sind Objekte, die zusätzliche Dinge, (u.a. schlaue Zeiger) speichern können. Das reicht mir.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113467</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 01 Sep 2011 13:47:42 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 15:03:10 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>Da wären wir wieder bei &quot;C++ hat keine echten Closures&quot;.</p>
</blockquote>
<p>Das war also damit gemeint.</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Interessant auch die Frage, wie</p>
<pre><code class="language-cpp">std::function&lt;void()&gt; foo(my_type x) {
  return [@]() { x.foo(); }
}
</code></pre>
<p>verarbeitet werden sollte - der aufrufende Code hätte ja keine Ahnung, dass er die Parameter auf den Heap legen muss.</p>
</blockquote>
<p>Gutes Argument. Gegenvorschlag: mit <code>[@]</code> kann ich von den Funktionsargumenten nur POD-Typen capturen sowie solche, die by-value übergeben werden und einen rvalue-reference-Kopierkonstruktor haben. Hoppla, da wird's schon kompliziert. Wenn es nicht solche Fehlbildungen wie std::auto_ptr&lt;&gt; gäbe, könnte man auch noch alles erlauben, was by-const-ref oder by-val übergeben wird und einen explizit implementierten, öffentlichen Kopierkonstruktor und Zuweisungsoperator hat, indem man deren Existenz die Absicht entnimmt, Wertsemantik zu implementieren. By-ref (und &quot;by-pointer&quot;, was auch unter by-ref fällt) könnte man einfach als Zeiger und mithin als POD betrachten.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Das @ gehört leider nicht zum source code character set.</p>
</blockquote>
<p>Krümelkacker? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Bitte denke den Vorschlag auch zu Ende. Du musst ja nicht gleich etwas druckreifes abgeben, aber ein bissel mehr Gedanken solltest Du Dir schon gemacht haben.</p>
</blockquote>
<p>Na komm, so unqualifiziert ist meine Einlassung jetzt auch nicht, daß du sie von so weit oben abbügeln mußt <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="😉"
    /> Ich wollte nur ergründen, ob ich die Capture-Regeln richtig verstehe. Ich habe auch gar nicht vor, sie zu ändern; du wolltest einen Änderungsvorschlag sehen.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Gibt es vielleicht Einschränkungen darüber, auf welche Variablen man sich da beziehen kann?</p>
</blockquote>
<p>Muß es offenbar; s.o.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Wann/wie/wo soll sollen Variablen auf'm Heap angelegt werden? Sollen die schon vorher dort leben. Sollen die kopiert werden beim Erzeugen des Funktionsobjekts? Erzähl mal, was das genau für ein Programmverhalten da sein soll in so einer Situation...</p>
</blockquote>
<p>Wenn ich in einem Funktions-Scope eine Lambda-Funktion mit <code>[@]</code> -Capturing verwende, werden alle solchermaßen referenzierten Locals, von den Funktionsargumenten abgesehen, in einem gemeinsam referenzgezählten Blob auf dem Heap angelegt. Wenn nicht, dann nicht.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>Das Problem scheint zu sein, dass Du das &quot;Closure-Verhalten&quot; einer anderen Sprache, nachahmen willst, die aber völlig anders funktioniert.</p>
</blockquote>
<p>Fast richtig, bis aufs Nachahmen. Ich wollte bestätigt wissen, daß das in C++ nicht so geht, wie ich mir das vorgestellt habe. Veranlassung des Threads war, daß mir eben erst klargeworden ist, daß die Capturing-Regeln von C++ deutlich anders funktionieren, als ich eigentlich dachte. (Bevor sich jemand ob meines Dilettantismus empört: ich habe Lambdas bisher nicht produktiv eingesetzt, weil mein Compiler sie noch nicht versteht. Ich habe also noch keinen Code für den Realeinsatz produziert, von dem ich nicht genau weiß, was er tut; ihr könnt also weiter nachts ruhig schlafen.)</p>
<p>Vielleicht hätte ich auf die Verwendung des Wortes &quot;einschränkend&quot; im Eröffnungspost verzichten sollen, denn das schien gewissen C++-Apologeten Anlaß zu sein, vorsichtshalber gleich mit &quot;Benutzerfehler[n]&quot;, &quot;ehrlich gesagt nicht für ein Problem&quot; oder mit ironischen Verweisen auf &quot;'echte Sprachen'&quot; zu kontern <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="😉"
    /> Meine Feststellung hat natürlich überhaupt keine Konsequenzen für C++. Du sagst es selbst: &quot;so funktioniert C++ aber nicht&quot;. Mir lag daran zu klären, wie es denn funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113493</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Thu, 01 Sep 2011 15:03:10 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 15:54:31 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>&quot;Echte Closures&quot; aus &quot;echten Sprachen&quot; werden hinter'm Vorhang mit shared_ptrs implementiert.</p>
</blockquote>
<p>Nein, die Implementationen, die ich mir angesehen habe, kennen kein <code>shared_ptr</code> .</p>
<blockquote>
<p>Nenn' es wie Du willst ... &quot;C++ closures&quot; sind Objekte, die zusätzliche Dinge, (u.a. schlaue Zeiger) speichern können. Das reicht mir.</p>
</blockquote>
<p>Nein, nenn es einfach nicht Closure. Annonyme Funktionen oder Lambda-Ausdruecke sind besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113502</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 01 Sep 2011 15:54:31 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 16:44:56 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>Wenn ich in einem Funktions-Scope eine Lambda-Funktion mit <code>[@]</code> -Capturing verwende, werden alle solchermaßen referenzierten Locals, von den Funktionsargumenten abgesehen, in einem gemeinsam referenzgezählten Blob auf dem Heap angelegt. Wenn nicht, dann nicht.</p>
</blockquote>
<p>Geht nicht. Denn im lokalen Scope koennen mehr Variablen sein als von der Funktion auf den Stack gepusht wurden. zB eine Memberfunktion einer Klasse kann zB ein einer Lambda Funktion eine Membervariable capturen. Und somit ist das ganze nicht mehr moeglich.</p>
<p>Ich sehe uebrigens absolut kein Problem mit dem aktuellen System. Einfach per &amp; capturen. Die Variable muss eh lange genug existieren - das muss man in C++ eben garantieren. Ansonsten einfach shared_ptr nehmen und fertig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113521</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Thu, 01 Sep 2011 16:44:56 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 18:56:36 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Nachdem C++ (die Core-Language) keinerlei GC oder andere automatische Speicherverwaltung hat mit der shared ownership möglich wäre...</p>
</blockquote>
<p>Referenzzählung geht immer, oder?</p>
</blockquote>
<p>Ne, eben nicht.<br />
Beispiel Parameter wurde ja schon gebracht.<br />
Anderes Beispiel: Member von irgendwelchen grösseren Objekten auf dem Stack.</p>
<p>Und selbst wenn du einen Weg findest das zu lösen, und ein nettes Proposal mit Reference-Counting zu formulieren...<br />
Willst du wirklich die Sprache um einen IMO entschieden nicht-trivialen Punkt wie &quot;automatische Shared-Ownership&quot; per Ref-Counting erweitern, nur für Lambda-Expressions?</p>
<p>Ich persönlich fände das reichlich beknackt. Vor allem würde ich mich dann ärgern, dass C++ (core-language) etwas mit Lambda-Expressions kann, an das man so nicht drankommt. Nämlich Reference-Counting.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113581</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113581</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 01 Sep 2011 18:56:36 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 19:16:22 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Geht nicht. Denn im lokalen Scope koennen mehr Variablen sein als von der Funktion auf den Stack gepusht wurden. zB eine Memberfunktion einer Klasse kann zB ein einer Lambda Funktion eine Membervariable capturen. Und somit ist das ganze nicht mehr moeglich.</p>
</blockquote>
<p>Dafür muss die Lambda sowieso den this-Pointer capturen. Allerdings würde es zu argen Problemen kommen, wenn das refernezierte Objekt dann plötzlich ge[@]-captured würde, weil sich die Referenzzählung dann möglicherweise mit der eines eventuell Objektbesitzenden shared_ptr beißt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113592</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 01 Sep 2011 19:16:22 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 19:54:08 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>&quot;Echte Closures&quot; aus &quot;echten Sprachen&quot; werden hinter'm Vorhang mit shared_ptrs implementiert.</p>
</blockquote>
<p>Nein, die Implementationen, die ich mir angesehen habe, kennen kein <code>shared_ptr</code> .</p>
</blockquote>
<p>Du hast meinen Smiley ignoriert.</p>
<p>knivil schrieb:</p>
<blockquote>
<blockquote>
<p>Nenn' es wie Du willst ... &quot;C++ closures&quot; sind Objekte, die zusätzliche Dinge, (u.a. schlaue Zeiger) speichern können. Das reicht mir.</p>
</blockquote>
<p>Nein, nenn es einfach nicht Closure. Annonyme Funktionen oder Lambda-Ausdruecke sind besser.</p>
</blockquote>
<p>Zu spät. (1) Das Wort &quot;closure&quot; taucht mehrfach im kommenden C++ Standard auf. (2) anonyme Funktion impliziert für mich &quot;zustandslos&quot; -- ist mir daher zu wenig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113623</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 01 Sep 2011 19:54:08 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Thu, 01 Sep 2011 22:17:48 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Geht nicht. Denn im lokalen Scope koennen mehr Variablen sein als von der Funktion auf den Stack gepusht wurden. zB eine Memberfunktion einer Klasse kann zB ein einer Lambda Funktion eine Membervariable capturen. Und somit ist das ganze nicht mehr moeglich.</p>
</blockquote>
<p>Der <code>this</code> -Zeiger wird, sofern erforderlich, by-value referenziert (als Zeiger, wohlgemerkt). Schon geht's.</p>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Ansonsten einfach shared_ptr nehmen und fertig.</p>
</blockquote>
<p>Ja, habe ich mittlerweile auch gelernt, danke <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>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Anderes Beispiel: Member von irgendwelchen grösseren Objekten auf dem Stack.</p>
</blockquote>
<p>Das Ding liegt ja dann auf dem Heap, nicht auf dem Stack.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Willst du wirklich die Sprache um einen IMO entschieden nicht-trivialen Punkt wie &quot;automatische Shared-Ownership&quot; per Ref-Counting erweitern, nur für Lambda-Expressions?</p>
<p>Ich persönlich fände das reichlich beknackt. Vor allem würde ich mich dann ärgern, dass C++ (core-language) etwas mit Lambda-Expressions kann, an das man so nicht drankommt. Nämlich Reference-Counting.</p>
</blockquote>
<p>Darüber kann man streiten. Ich gebe aber zu, daß es deutlich schöner ist, so eine Implementation vorzunehmen in einer Umgebung, die schon über nennenswerte intrinsische Speicherverwaltungsmechanismen verfügt.</p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Allerdings würde es zu argen Problemen kommen, wenn das refernezierte Objekt dann plötzlich ge[@]-captured würde, weil sich die Referenzzählung dann möglicherweise mit der eines eventuell Objektbesitzenden shared_ptr beißt...</p>
</blockquote>
<p>Auf <code>this</code> sollte sich das Closure nicht lebensverlängernd auswirken - wie auch, ist ja nur ein Zeiger.</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>knivil schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>&quot;Echte Closures&quot; aus &quot;echten Sprachen&quot; werden hinter'm Vorhang mit shared_ptrs implementiert.</p>
</blockquote>
<p>Nein, die Implementationen, die ich mir angesehen habe, kennen kein <code>shared_ptr</code> .</p>
</blockquote>
<p>Du hast meinen Smiley ignoriert.</p>
</blockquote>
<p>Krümel um Krümel? <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/2113662</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113662</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Thu, 01 Sep 2011 22:17:48 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Fri, 02 Sep 2011 02:38:54 GMT]]></title><description><![CDATA[<p>audacia schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Anderes Beispiel: Member von irgendwelchen grösseren Objekten auf dem Stack.</p>
</blockquote>
<p>Das Ding liegt ja dann auf dem Heap, nicht auf dem Stack.</p>
</blockquote>
<p>Ach du willst immer das äusserste Objekt automatisch in den Heap verfrachten?</p>
<p>Was machst du mit Parametern? Woher soll die aufrufende Funktion wissen dass das Objekt mit Ref-Counting angelegt werden muss?</p>
<p>Was machst du wenn Member von &quot;*this&quot; Referenziert werden?</p>
<p>Im Endeffekt läuft es darauf hinaus, dass du entweder ein ganz greisliche Bastellösung bekommst, in der es 100 Ausnahmen gibt was alles nicht erlaubt ist, und 100 komische Effekte, mit denen keiner rechnet.</p>
<p>Oder aber du bastelst C++ in eine Sprache um, die - nicht nur für Lambda-Expressions - ne automatische Speicherverwaltung hat. Entweder klassisch mit GC und nicht deterministischer Finalisierung. Oder halt mit Ref-Counting (und allen sich darauf ergebenden Nachteilen), dafür aber mit deterministischer Finalisierung.</p>
<p>Vermutlich wäre es aber einfacher, wenn du stattdessen gleich C++/CLI oder D nimmst. Oder eine der anderen, &quot;klassischen&quot; GC-Sprachen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113681</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Fri, 02 Sep 2011 02:38:54 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Fri, 02 Sep 2011 03:28:49 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>audacia schrieb:</p>
<blockquote>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Anderes Beispiel: Member von irgendwelchen grösseren Objekten auf dem Stack.</p>
</blockquote>
<p>Das Ding liegt ja dann auf dem Heap, nicht auf dem Stack.</p>
</blockquote>
<p>Ach du willst immer das äusserste Objekt automatisch in den Heap verfrachten?</p>
</blockquote>
<p>Ja. Alle (oder auch: alle direkt oder indirekt durch Capturing betroffenen) lokalen Variablen einer Funktion, in der <code>[@]</code> verwendet wird, werden auf dem Heap angelegt.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Was machst du mit Parametern? Woher soll die aufrufende Funktion wissen dass das Objekt mit Ref-Counting angelegt werden muss?</p>
</blockquote>
<p>Hatten wir oben. Das <code>[@]</code> -Capturing von Parametern muß man offenbar restringieren.</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Was machst du wenn Member von &quot;*this&quot; Referenziert werden?</p>
</blockquote>
<p>Habe ich auch schon gesagt: <code>this</code> by-value kopieren (den Zeiger!).</p>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Im Endeffekt läuft es darauf hinaus, dass du entweder ein ganz greisliche Bastellösung bekommst, in der es 100 Ausnahmen gibt was alles nicht erlaubt ist, und 100 komische Effekte, mit denen keiner rechnet.</p>
</blockquote>
<p>Stimmt. Nicht daß das mit <code>[=]</code> und <code>[&amp;]</code> irgendwie anders wäre <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>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Oder aber du bastelst C++ in eine Sprache um, die - nicht nur für Lambda-Expressions - ne automatische Speicherverwaltung hat.</p>
</blockquote>
<p>So weit wollen wir im Rahmen dieses Gedankenexperiments lieber nicht gehen <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>
<p>hustbaer schrieb:</p>
<blockquote>
<p>Vermutlich wäre es aber einfacher, wenn du stattdessen gleich C++/CLI oder D nimmst. Oder eine der anderen, &quot;klassischen&quot; GC-Sprachen.</p>
</blockquote>
<p>Oder wenn ich mich einfach damit abfinde und das beste daraus mache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113686</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Fri, 02 Sep 2011 03:28:49 GMT</pubDate></item><item><title><![CDATA[Reply to Capture-Regeln bei Lambda-Funktionen on Fri, 02 Sep 2011 08:49:54 GMT]]></title><description><![CDATA[<p>Stimmt. Nicht daß das mit <code>[=]</code> und <code>[&amp;]</code> irgendwie anders wäre ;)[/quote]<br />
Nö, du kannst alles per value capturen, was kopierbar ist, und auf alles ne Referenz halten, was erreichbar ist. Ob du das jetzt per Lambda oder mit ner selbstgeschraubten lokalen Klasse machst, ist wurscht. Lambdas haben in der Hinsicht nichts eingeführt, was man ohne sie nicht hinbekommen hätte (in C++0x), sie sind nur syntaktischer Zucker. Die [@]-Capture hätte aber nicht nur die Sprache selbst sondern auch das Speichermodell grundlegend verändert, das spielt also wirklich in einer ganz anderen Liga.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2113743</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2113743</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 02 Sep 2011 08:49:54 GMT</pubDate></item></channel></rss>