<?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[Lambda Expression and auto]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe zwar keine Frage, aber muss das trotzdem mit euch teilen. Vielleicht inspiriert das den ein oder anderen ja. Wenn wir öfters so kleine C++11 Codestücken untereinander teilen, kommen wir alle schneller vorwärts <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>
<pre><code>#include &lt;iostream&gt;
#include &lt;functional&gt;
#include &lt;string&gt;

using namespace std;

function&lt;string (const string&amp; str)&gt; makeStringAppender(const string&amp; appy)
{
	return [=](const string&amp; str) { return str+appy; };
}

int main()
{
	auto textAppender = makeStringAppender(&quot;.txt&quot;);
	auto jpegAppender = makeStringAppender(&quot;.jpg&quot;);

	auto s1 = jpegAppender(&quot;Urlaub&quot;), s3 = jpegAppender(&quot;Bild1&quot;);
	auto s2 = textAppender(&quot;Doku&quot;);

	cout &lt;&lt; s1 &lt;&lt; &quot; &quot; &lt;&lt; s2 &lt;&lt; &quot; &quot; &lt;&lt; s3 &lt;&lt; endl;
}
</code></pre>
<p>Einfach toll und sieht auch noch gut aus!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/310305/lambda-expression-and-auto</link><generator>RSS for Node</generator><lastBuildDate>Sat, 25 Jul 2026 10:10:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/310305.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 08 Nov 2012 12:51:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lambda Expression and auto on Thu, 08 Nov 2012 12:51:35 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe zwar keine Frage, aber muss das trotzdem mit euch teilen. Vielleicht inspiriert das den ein oder anderen ja. Wenn wir öfters so kleine C++11 Codestücken untereinander teilen, kommen wir alle schneller vorwärts <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>
<pre><code>#include &lt;iostream&gt;
#include &lt;functional&gt;
#include &lt;string&gt;

using namespace std;

function&lt;string (const string&amp; str)&gt; makeStringAppender(const string&amp; appy)
{
	return [=](const string&amp; str) { return str+appy; };
}

int main()
{
	auto textAppender = makeStringAppender(&quot;.txt&quot;);
	auto jpegAppender = makeStringAppender(&quot;.jpg&quot;);

	auto s1 = jpegAppender(&quot;Urlaub&quot;), s3 = jpegAppender(&quot;Bild1&quot;);
	auto s2 = textAppender(&quot;Doku&quot;);

	cout &lt;&lt; s1 &lt;&lt; &quot; &quot; &lt;&lt; s2 &lt;&lt; &quot; &quot; &lt;&lt; s3 &lt;&lt; endl;
}
</code></pre>
<p>Einfach toll und sieht auch noch gut aus!!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268920</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Thu, 08 Nov 2012 12:51:35 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Expression and auto on Thu, 08 Nov 2012 14:03:16 GMT]]></title><description><![CDATA[<p>Das funktioniert wahrscheinlich nur, weil beispielsweise &quot;.txt&quot; im Datensegment liegt und ein konstanter Zeiger ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268956</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Thu, 08 Nov 2012 14:03:16 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Expression and auto on Thu, 08 Nov 2012 14:19:36 GMT]]></title><description><![CDATA[<p>knivil schrieb:</p>
<blockquote>
<p>Das funktioniert wahrscheinlich nur, weil beispielsweise &quot;.txt&quot; im Datensegment liegt und ein konstanter Zeiger ist.</p>
</blockquote>
<p>Wenn ich raten müsste, würde ich sagen, du glaubst, dass [=] &quot;nur die Referenz appy kopiert&quot;. Tatsächlich speichert die Lambdafunktion einen std::string (und keine Referenz auf einen String). Deswegen sehe ich hier auch keinerlei Probleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2268966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2268966</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Thu, 08 Nov 2012 14:19:36 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Expression and auto on Wed, 21 Aug 2013 11:18:50 GMT]]></title><description><![CDATA[<p>Ich habe heute dafür einen tollen Anwendungszweck endeckt.</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;functional&gt;
#include &lt;string&gt;

using namespace std;

struct Node
{
    int data;
    Node(int d) : data(d), leftChild(nullptr), rightChild(nullptr) { }
    Node *leftChild;
    Node *rightChild;
};

function&lt;void (Node* node)&gt; makePostOrderFunction(function&lt;void (Node *node)&gt; nodeFunction)
{
    function&lt;void (Node* node)&gt; postOrder;

    postOrder = [&amp;](Node* node)
    {
        if(node == nullptr)
            return;

        postOrder(node-&gt;leftChild);
        postOrder(node-&gt;rightChild);

        nodeFunction(node);
    };

    return postOrder;
}

void printNode(Node *node)
{
    cout &lt;&lt; node-&gt;data &lt;&lt; endl;
}

void getCoolNode(Node *node)
{
    if(node-&gt;data % 2)
        /*insert into my cool vector*/;
}

int main()
{
    Node *root = new Node(1);
    root-&gt;leftChild = new Node(2);
    root-&gt;rightChild = new Node(3);

    auto printTree = makePostOrderFunction(printNode);
    auto findCoolNodes = makePostOrderFunction(getCoolNode);

    printTree(root);
    findCoolNodes(root);
}
</code></pre>
<p>So kann ich mir nach belieben postOrder-Funktionen generieren, die auch noch named sind. Wobei man auch einfach so hätte machen können:</p>
<pre><code>void postOrderOperation(Node *node, function&lt;void (Node *node)&gt; operation)
{
    if(node == nullptr)
        return;

    postOrderOperation(node-&gt;leftChild, operation);
    postOrderOperation(node-&gt;rightChild, operation);

    operation(node);
}

auto printTree = [&amp;](Node *node) { postOrderOperation(node, printNode); };
printTree(root);
</code></pre>
<p>Oder doch direkt so:</p>
<pre><code>function&lt;void (Node* node)&gt; makePostOrderOperation(function&lt;void (Node *node)&gt; nodeFunction)
{
    return [&amp;](Node *node) { postOrderOperation(node, nodeFunction); };
}

auto printTree = makePostOrderOperation(printNode);
printTree(root);
</code></pre>
<p>Achja, hat doch nicht so viel gebracht <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2347462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347462</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 21 Aug 2013 11:18:50 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Expression and auto on Wed, 21 Aug 2013 11:42:41 GMT]]></title><description><![CDATA[<pre><code>[&amp;](Node *node) { postOrderOperation(node, nodeFunction); }
</code></pre>
<p>So gibst du doch indirekt eine Referenz auf ein lokales Objekt zurück ( <code>postOrderOperation</code> )! Ändere den lambda-introducer zu <code>[=]</code> , dann klappt das.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347469</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347469</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 21 Aug 2013 11:42:41 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Expression and auto on Wed, 21 Aug 2013 12:37:44 GMT]]></title><description><![CDATA[<p>Klappt doch so. Das lokale Objekte ist hier zwar nodeFunction, aber das closure object wird doch bei der Rückgabe kopiert und dadurch sollte hier imho keine dangling reference entstehen.</p>
<p>Aber prinzipiell sollte da doch lieber ein [=] hin.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347486</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 21 Aug 2013 12:37:44 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Expression and auto on Wed, 21 Aug 2013 12:49:34 GMT]]></title><description><![CDATA[<blockquote>
<p>aber das closure object wird doch bei der Rückgabe kopiert</p>
</blockquote>
<p>Was dann?</p>
<p>§5.1.2 / 15 schrieb:</p>
<blockquote>
<p>It is unspecified whether additional unnamed non-static data members are declared in the closure type for entities captured by reference</p>
</blockquote>
<p>Wodurch beim implizit definierten Kopierkonstruktor natürlich kein solches von dir beschriebenes Verhalten entstehen muss;<br />
<img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<p>§5.1.2 / 22 schrieb:</p>
<blockquote>
<p>If an entity is implicitly or explicitly captured by reference, invoking the function call operator of the corresponding lambda-expression after the lifetime of the entity has ended is likely to result in undefined behavior</p>
</blockquote>
<p>Wobei ich hier etwas unsicher bin, ob &quot;corresponding lambda expression&quot; auch alle Kopien davon mit einschließt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347492</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Wed, 21 Aug 2013 12:49:34 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Expression and auto on Wed, 21 Aug 2013 12:50:03 GMT]]></title><description><![CDATA[<p>Sone schrieb:</p>
<blockquote>
<p>§5.1.2 / 22:</p>
<blockquote>
<p>If an entity is implicitly or explicitly captured by reference, i<strong>nvoking the function call operator of the corresponding lambda-expression after the lifetime of the entity has ended</strong> is likely to result in undefined behavior</p>
</blockquote>
</blockquote>
<p>Tue ich doch nicht. Durch die Rückgabe wird die Referenz, also der Wert dahinter, kopiert und der Lambda-Aufruf geschieht erst nach dieser Kopie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347494</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 21 Aug 2013 12:50:03 GMT</pubDate></item><item><title><![CDATA[Reply to Lambda Expression and auto on Wed, 21 Aug 2013 13:00:58 GMT]]></title><description><![CDATA[<p>Gabs da mal nicht einen hübschen Artikel zur Lebensdauer von Lambdas? Herb, Meyers, ... hmmm</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2347498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2347498</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Wed, 21 Aug 2013 13:00:58 GMT</pubDate></item></channel></rss>