<?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[ADL und Rückgabewerte]]></title><description><![CDATA[<p>Hallo,</p>
<p>bekannt ist ja z.B. der folgende ADL-Trick mit <code>swap</code> :</p>
<pre><code>template&lt;typename T&gt;
void Swap(T&amp; Lhs, T&amp; Rhs)
{
	using std::swap;
	swap(Lhs, Rhs);
}
</code></pre>
<p>Natürlich gibt ein <code>swap</code> eigentlich nichts zurück, das soll nun aber nur stellvertretend stehen für jede beliebige Funktion, die etwas zurückgibt und diesen ADL-Trick benutzt.<br />
Die Frage ist nun jedoch, wie dasselbe Lookup-Verhalten beim Rückgabetypen in C++03 erreicht werden kann. In C++11 habe ich es (quick 'n' dirty) hinbekommen (ich frage mich jedoch was geschieht / geschehen sollte, wenn jemand <code>std::swap</code> in den globalen Namensraum holt):</p>
<pre><code>template&lt;typename T&gt;
struct HasCustomSwap
{
	template&lt;typename U&gt;
	static al::TrueType Check(decltype(swap(std::declval&lt;T&gt;(), std::declval&lt;T&gt;()))*);

	template&lt;typename U&gt;
	static al::FalseType Check(...);

	static const bool Value = sizeof(Check&lt;T&gt;(0)) == sizeof(al::TrueType);
};

template&lt;typename T, bool Custom = HasCustomSwap&lt;T&gt;::Value&gt;
struct SwapRet;

template&lt;typename T&gt;
struct SwapRet&lt;T, true&gt;
{
	typedef decltype(swap(std::declval&lt;T&gt;(), std::declval&lt;T&gt;())) Type;
};

template&lt;typename T&gt;
struct SwapRet&lt;T, false&gt;
{
	typedef void Type; // Der Rückgabetyp von std::swap
};

template&lt;typename T&gt;
typename SwapRet&lt;T&gt;::Type SwapClone(T&amp; Lhs, T&amp; Rhs)
{
	using std::swap;
	return swap(Lhs, Rhs);
}
</code></pre>
<p>Und wenn ich schon einen Thread aufgemacht habe, dann noch gleich was anderes:<br />
Wie kann ich den folgenden trivialen C++11-Code nach C++03 umschreiben?</p>
<pre><code>template&lt;typename ContainerT&gt;
struct BeginT
{
	typedef decltype(std::declval&lt;ContainerT&gt;().begin()) Type;
};
</code></pre>
<p>Ich habe daran rumgebastelt aber bin leider nicht vom Fleck gekommen.</p>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/327537/adl-und-rückgabewerte</link><generator>RSS for Node</generator><lastBuildDate>Thu, 09 Jul 2026 00:49:02 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/327537.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 18 Aug 2014 11:44:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 11:44:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>bekannt ist ja z.B. der folgende ADL-Trick mit <code>swap</code> :</p>
<pre><code>template&lt;typename T&gt;
void Swap(T&amp; Lhs, T&amp; Rhs)
{
	using std::swap;
	swap(Lhs, Rhs);
}
</code></pre>
<p>Natürlich gibt ein <code>swap</code> eigentlich nichts zurück, das soll nun aber nur stellvertretend stehen für jede beliebige Funktion, die etwas zurückgibt und diesen ADL-Trick benutzt.<br />
Die Frage ist nun jedoch, wie dasselbe Lookup-Verhalten beim Rückgabetypen in C++03 erreicht werden kann. In C++11 habe ich es (quick 'n' dirty) hinbekommen (ich frage mich jedoch was geschieht / geschehen sollte, wenn jemand <code>std::swap</code> in den globalen Namensraum holt):</p>
<pre><code>template&lt;typename T&gt;
struct HasCustomSwap
{
	template&lt;typename U&gt;
	static al::TrueType Check(decltype(swap(std::declval&lt;T&gt;(), std::declval&lt;T&gt;()))*);

	template&lt;typename U&gt;
	static al::FalseType Check(...);

	static const bool Value = sizeof(Check&lt;T&gt;(0)) == sizeof(al::TrueType);
};

template&lt;typename T, bool Custom = HasCustomSwap&lt;T&gt;::Value&gt;
struct SwapRet;

template&lt;typename T&gt;
struct SwapRet&lt;T, true&gt;
{
	typedef decltype(swap(std::declval&lt;T&gt;(), std::declval&lt;T&gt;())) Type;
};

template&lt;typename T&gt;
struct SwapRet&lt;T, false&gt;
{
	typedef void Type; // Der Rückgabetyp von std::swap
};

template&lt;typename T&gt;
typename SwapRet&lt;T&gt;::Type SwapClone(T&amp; Lhs, T&amp; Rhs)
{
	using std::swap;
	return swap(Lhs, Rhs);
}
</code></pre>
<p>Und wenn ich schon einen Thread aufgemacht habe, dann noch gleich was anderes:<br />
Wie kann ich den folgenden trivialen C++11-Code nach C++03 umschreiben?</p>
<pre><code>template&lt;typename ContainerT&gt;
struct BeginT
{
	typedef decltype(std::declval&lt;ContainerT&gt;().begin()) Type;
};
</code></pre>
<p>Ich habe daran rumgebastelt aber bin leider nicht vom Fleck gekommen.</p>
<p>Gruss</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413904</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 18 Aug 2014 11:44:08 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 12:14:37 GMT]]></title><description><![CDATA[<pre><code>template&lt;typename ContainerT&gt;
struct BeginT
{
    typedef typename ContainerT::iterator Type;
};
</code></pre>
<p>? :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413911</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413911</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 18 Aug 2014 12:14:37 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 12:27:15 GMT]]></title><description><![CDATA[<p>Dann vermutlich schon eher:</p>
<pre><code>template&lt;typename ContainerT&gt;
struct BeginT
{
    typedef typename ContainerT::iterator Type;
};
template&lt;typename ContainerT&gt;
struct BeginT&lt;const ContainerT&gt;
{
    typedef typename ContainerT::const_iterator Type;
};
</code></pre>
<p><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 />
Das Problem ist jedoch, dass ich bei gewissen Container die Methode <code>begin</code> definiere (damit Range-Based-For-Loops funktionieren), der Rest (und somit auch die Iteratortypen) jedoch mein gewohntes PascalCase ist, womit diese Lösung dann leider nicht funktioniert.<br />
Wenn es nicht geht, so könnte ich alternativ noch sowas wie ContainerTraits basteln, dann funktionieren aber z.B. Container aus Boost nicht ohne Weiteres.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413917</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 18 Aug 2014 12:27:15 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 12:32:21 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>Wie kann ich den folgenden trivialen C++11-Code nach C++03 umschreiben?</p>
<pre><code>template&lt;typename ContainerT&gt;
struct BeginT
{
	typedef decltype(std::declval&lt;ContainerT&gt;().begin()) Type;
};
</code></pre>
</blockquote>
<p>Allgemeingültig wahrscheinlich gar nicht (begin könnte Defaultargumente haben). Praktisch ausreichend dürfte es sein, einfach &amp;ContainerT::begin zu analysieren. Wenn begin pathologisch ist und einen Funktor darstellt, muss dann eben noch &amp;ContainerT::begin::operator() untersucht werden. Hatten wir ja gerade erst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413919</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 18 Aug 2014 12:32:21 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 12:41:37 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Allgemeingültig wahrscheinlich gar nicht (begin könnte Defaultargumente haben). Praktisch ausreichend dürfte es sein, einfach &amp;ContainerT::begin zu analysieren. Wenn begin pathologisch ist und einen Funktor darstellt, muss dann eben noch &amp;ContainerT::begin::operator() untersucht werden. Hatten wir ja gerade erst.</p>
</blockquote>
<p>Es geht konkret wirklich nur um <code>ContainerT::begin</code> . Auf <code>&amp;ContainerT::begin</code> bin ich auch schon gekommen, wie ich aber von einer Instanz des Methodenzeigers auf den Rückgabetypen dessen komme, ist mir schleierhaft.</p>
<p>Du spielst vermutlich auf <a href="http://www.c-plusplus.net/forum/327479-full" rel="nofollow">diesen Thread</a> an. Ich habe jetzt auf die Schnelle nichts gesehen zum Auslesen des Rückgabetypen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413920</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 18 Aug 2014 12:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 12:57:58 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>Allgemeingültig wahrscheinlich gar nicht (begin könnte Defaultargumente haben). Praktisch ausreichend dürfte es sein, einfach &amp;ContainerT::begin zu analysieren. Wenn begin pathologisch ist und einen Funktor darstellt, muss dann eben noch &amp;ContainerT::begin::operator() untersucht werden. Hatten wir ja gerade erst.</p>
</blockquote>
<p>Es geht konkret wirklich nur um <code>ContainerT::begin</code> . Auf <code>&amp;ContainerT::begin</code> bin ich auch schon gekommen, wie ich aber von einer Instanz des Methodenzeigers auf den Rückgabetypen dessen komme, ist mir schleierhaft.</p>
</blockquote>
<p>Der alte Spezialisierungstrick... , oh moment, geht ja nicht, wegen fehlden Varargs.<br />
Edit: Fail, decltype gibts ja nicht.<br />
Also nicht ganz allgemein:</p>
<pre><code>template &lt;typename Fnc&gt;
struct get_return;

template &lt;typename R, typename C&gt;
struct get_return&lt;R (C::*)()&gt;
{
  // using... oh, kein using, C++03 ist irgendwie Mist
  typedef R type; // ich glaub so rum... typedef hab ich schon ewig nicht mehr benutzt
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2413923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413923</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 18 Aug 2014 12:57:58 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 12:53:19 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>wie ich aber von einer Instanz des Methodenzeigers auf den Rückgabetypen dessen komme, ist mir schleierhaft.</p>
</blockquote>
<p>Mir auch. War nicht ganz bei der Sache. decltype ist ja nicht ganz zufällig in die Sprache aufgenommen worden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413924</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413924</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 18 Aug 2014 12:53:19 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 13:04:50 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<pre><code>template &lt;typename Fnc&gt;
struct get_return;

template &lt;typename R, typename C&gt;
struct get_return&lt;R (C::*)()&gt;
{
  // using... oh, kein using, C++03 ist irgendwie Mist
  typedef R type; // ich glaub so rum... typedef hab ich schon ewig nicht mehr benutzt
};
</code></pre>
</blockquote>
<p>Und wie kann ich bei <code>Fnc</code> nun den Typen von <code>&amp;ContainerT::begin</code> einsetzen? Braucht leider auch wieder <code>decltype</code> .</p>
<p>Edit:</p>
<p>camper schrieb:</p>
<blockquote>
<p>decltype ist ja nicht ganz zufällig in die Sprache aufgenommen worden.</p>
</blockquote>
<p>Naja, C++11 hat schon teilweise Sprachelemente eingeführt, die nur Syntax Sugar sind (mir fallen aus dem Stegreif gerade Range-Based-For-Loops und <code>auto</code> ein). Aber ich entnehme daraus, dass <code>decltype</code> nicht dazugehört (dessen war ich mir schon ziemlich sicher) die Möglichkeit das in C++03 zu implementieren nicht besteht, was?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413925</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 18 Aug 2014 13:04:50 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 13:07:22 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<pre><code>template &lt;typename Fnc&gt;
struct get_return;

template &lt;typename R, typename C&gt;
struct get_return&lt;R (C::*)()&gt;
{
  // using... oh, kein using, C++03 ist irgendwie Mist
  typedef R type; // ich glaub so rum... typedef hab ich schon ewig nicht mehr benutzt
};
</code></pre>
</blockquote>
<p>Und wie kann ich bei <code>Fnc</code> nun den Typen von <code>&amp;ContainerT::begin</code> einsetzen? Braucht leider auch wieder <code>decltype</code> .</p>
</blockquote>
<p>Jaja, sieh meinem Edit.</p>
<blockquote>
<p>Edit:</p>
<p>camper schrieb:</p>
<blockquote>
<p>decltype ist ja nicht ganz zufällig in die Sprache aufgenommen worden.</p>
</blockquote>
<p>Naja, C++11 hat schon teilweise Sprachelemente eingeführt, die nur Syntax Sugar sind (mir fallen aus dem Stegreif gerade Range-Based-For-Loops und <code>auto</code> ein). Aber ich entnehme daraus, dass <code>decltype</code> nicht dazugehört (dessen war ich mir schon ziemlich sicher) die Möglichkeit das in C++03 zu implementieren nicht besteht, was?</p>
</blockquote>
<p>Nein, aber gcc bspw. bietet ein typeof an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413927</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 18 Aug 2014 13:07:22 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 14:35:28 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>Naja, C++11 hat schon teilweise Sprachelemente eingeführt, die nur Syntax Sugar sind (mir fallen aus dem Stegreif gerade Range-Based-For-Loops und <code>auto</code> ein).</p>
</blockquote>
<p>Echt? Wie kann man das hier ohne <code>auto</code> implementieren?</p>
<pre><code>template &lt;typename iter&gt;
auto sum(iter begin_, iter end_) -&gt; typename std::remove_reference&lt;decltype(*begin_)&gt;::type
{
	using T = decltype(sum(begin_, end_));
	T tmp(0);
	while (begin_ != end_) {
		tmp += *begin_;
		++begin_;
	}
	return tmp;
}
</code></pre>
<p>Glaube zwar mal gelesen zu haben dass man <code>auto</code> immer mit einem passenden <code>decltype</code> ersetzen kann, aber hier wüsste ich nicht wie. Deswegen würde ich schon sagen das <code>auto</code> mehr als Syntax Sugar ist, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413938</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 18 Aug 2014 14:35:28 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 14:40:13 GMT]]></title><description><![CDATA[<pre><code>template &lt;typename iter&gt;
typename std::remove_reference&lt;decltype(*std::declval&lt;iter&gt;())&gt;::type sum(iter begin_, iter end_)
</code></pre>
<p><code>auto</code> ist im Übrigen nicht nur Syntaxzucker. Wie wollt ihr sonst</p>
<pre><code>auto x = []{};
</code></pre>
<p>schreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413940</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 18 Aug 2014 14:40:13 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 14:51:54 GMT]]></title><description><![CDATA[<p>Ok, wieder was gelernt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413943</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 18 Aug 2014 14:51:54 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 14:53:03 GMT]]></title><description><![CDATA[<p>Diese <code>auto f() -&gt; decltype()</code> -Geschichte ist AFAIK auch nur Syntaxzucker (Vermeidung von Redundanz), berichtige mich bitte einer wenn ich falsch liege. Das Hauptargument dafür war ja dass man Bereichsauflösungen nicht mehr angeben muss und dass man sich auf die Argumente beziehen kann. Ersteres dürfte mit ausschreiben möglich sein (mir fällt im Moment kein Fall ein bei dem das nicht geht, habe aber irgendetwas mit verschachtelten Klassentemplates dazu im Hinterkopf) und letzteres mit <code>std::declval</code> (was natürlich auch in C++03 implementierbar ist).</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p><code>auto</code> ist im Übrigen nicht nur Syntaxzucker. Wie wollt ihr sonst</p>
<pre><code>auto x = []{};
</code></pre>
<p>schreiben?</p>
</blockquote>
<p>Hoppla, ja an Lambdas hab ich nicht gedacht, da hast du recht.</p>
<p>An die TMP-Pros hier:<br />
Sind Variadic Templates Syntaxzucker wenn man von beliebig grossen Typlisten ausgeht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413944</guid><dc:creator><![CDATA[Fytch]]></dc:creator><pubDate>Mon, 18 Aug 2014 14:53:03 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 15:19:05 GMT]]></title><description><![CDATA[<p>asfdlol schrieb:</p>
<blockquote>
<p>An die TMP-Pros hier:<br />
Sind Variadic Templates Syntaxzucker wenn man von beliebig grossen Typlisten ausgeht?</p>
</blockquote>
<p>Jein.<br />
Wenn man so etwas wie Alexandrescus Typelist hat mit beliebiger Anzahl an Erstellungsmakros kann man afaik alle Algorithmen auf Listen von Typen und so Dinge wie Tuples implementieren.<br />
Was dann aber fehlt sind eine variable Anzahl an Parametern. Man muss dafür Tuple nehmen. Und auch Spezialisierungen für jede beliebige Funktion gehen dann nicht:</p>
<pre><code>template &lt;typename R, typename ... Arg&gt;
struct foo&lt;R(Arg...)&gt; // wie ohne variadic templates?
</code></pre>
<p>Man muss das dann wieder für jede Anzahl an Argumenten spezialisieren.<br />
Wenn man das aber außen vorlässt, dann ja, sind sie nur Syntaxzucker, allerdings einer von der Sorte, der sehr viel Redunanz spart.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413950</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413950</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 18 Aug 2014 15:19:05 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 16:17:50 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p><code>auto</code> ist im Übrigen nicht nur Syntaxzucker. Wie wollt ihr sonst</p>
<pre><code>auto x = []{};
</code></pre>
<p>schreiben?</p>
</blockquote>
<p>Moment, also das hier geht auch ganz ohne <code>auto</code> :</p>
<pre><code>using lambda = void(*)();
lambda x = []{};
</code></pre>
<p>Also doch nur (sehr nützlicher) Syntax Sugar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413960</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 18 Aug 2014 16:17:50 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 16:21:56 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Arcoth schrieb:</p>
<blockquote>
<p><code>auto</code> ist im Übrigen nicht nur Syntaxzucker. Wie wollt ihr sonst</p>
<pre><code>auto x = []{};
</code></pre>
<p>schreiben?</p>
</blockquote>
<p>Moment, also das hier geht auch ganz ohne <code>auto</code> :</p>
<pre><code>using lambda = void(*)();
lambda x = []{};
</code></pre>
<p>Also doch nur (sehr nützlicher) Syntax Sugar?</p>
</blockquote>
<p>Ja, aber sobald du etwas captures (?), gehts nicht mehr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413962</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 18 Aug 2014 16:21:56 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 16:46:54 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Ja, aber sobald du etwas captures (?), gehts nicht mehr.</p>
</blockquote>
<p>Hm, wie wärs dann mit:</p>
<pre><code>std::function&lt;void(void)&gt; x = [=]{};
</code></pre>
<p>?</p>
<p>Das geht bei mir auf jeden Fall...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413967</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 18 Aug 2014 16:46:54 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 16:53:06 GMT]]></title><description><![CDATA[<blockquote>
<p>Ja, aber sobald du etwas captures (?), gehts nicht mehr.</p>
</blockquote>
<p>Stimmt schon, darauf wollte ich auch hinaus. Wenn du etwas capturest bekommt das closure-Objekt ja einen State.</p>
<p>Ich meine mich zu erinnern dass camper erwähnt hat dass <code>auto</code> ursprünglich für Lambdas eingeführt wurde.</p>
<blockquote>
<p>Sind Variadic Templates Syntaxzucker wenn man von beliebig grossen Typlisten ausgeht?</p>
</blockquote>
<p>Wie willst du ein Lambda eine variable Anzahl von Argumenten nehmen lassen?</p>
<pre><code>[] (auto&amp;&amp;... a) {return f( std::forward&lt;decltype(a)&gt;(a)... );}
</code></pre>
<p>Bei gewöhnlichen Funktionstemplates oder Klassentemplates kann man zwar für jede Länge explizit spezialisieren, ist aber auch verdammt hässlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413970</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 18 Aug 2014 16:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 16:56:04 GMT]]></title><description><![CDATA[<blockquote>
<p>Hm, wie wärs dann mit:<br />
[..]</p>
</blockquote>
<p>Ist viel langsamer. Wenn du dann noch das Objekt an ein Funktionstemplate übergibst (wie <code>std::copy_if</code> o.ä.), wird es deutlich lahmer, weil ständig der Umweg über <code>function</code> gemacht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413971</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 18 Aug 2014 16:56:04 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 18:03:28 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Ist viel langsamer. Wenn du dann noch das Objekt an ein Funktionstemplate übergibst (wie <code>std::copy_if</code> o.ä.), wird es deutlich lahmer, weil ständig der Umweg über <code>function</code> gemacht wird.</p>
</blockquote>
<p>Hm, Ok.</p>
<p>Aber eigentlich ist ein Lambda ja auch nur Syntax Sugar weil man sich ja genausogut (und trivial) immer einen Functor mit der selben Funktionalität bauen kann.</p>
<p>Also braucht man <code>auto</code> eigentlich nur dann zwingend (= für nicht-Syntax Sugar) wenn man wiederum Syntax Sugar (nämlich ein Lambda) benutzen will. Somit wäre <code>auto</code> wiederum selbst nur Syntax Sugar.</p>
<p>Oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413984</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 18 Aug 2014 18:03:28 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 18:08:09 GMT]]></title><description><![CDATA[<p>Ne, genauso trivial garantiert nicht. Lambdas sind einfach irre sexy.</p>
<p>Boost.Lambda ist auch nett.</p>
<p>Im Prinzip hast du aber recht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413986</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 18 Aug 2014 18:08:09 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 18:19:22 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Ne, genauso trivial garantiert nicht. Lambdas sind einfach irre sexy.</p>
</blockquote>
<p>Ja, das auf jeden Fall.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Im Prinzip hast du aber recht.</p>
</blockquote>
<p>Die eigentliche Frage wäre halt, wo Syntax Sugar anfängt bzw. aufhört.</p>
<p>Weil wenn man so argumentiert könnte man ja auch sagen dass templates auch nur Syntax Sugar sind und das ist dann glaube ich nicht mehr sinnvoll...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413990</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413990</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 18 Aug 2014 18:19:22 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 18:35:49 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Weil wenn man so argumentiert könnte man ja auch sagen dass templates auch nur Syntax Sugar sind und das ist dann glaube ich nicht mehr sinnvoll...</p>
</blockquote>
<p>Fast alle C++-Features sind Syntax Sugar. Bis auf RAII, SFINAE, constexpr und decltype kann man alles in C nachimplementieren.<br />
Und alles in C in Assembler. Und alles Assembler direkt als purer Machinencode.<br />
Aller Programmiersprachen sind Syntax Sugar, das ist der Sinn von ihnen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2413998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2413998</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 18 Aug 2014 18:35:49 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Mon, 18 Aug 2014 18:59:36 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Fast alle C++-Features sind Syntax Sugar. Bis auf RAII, SFINAE, constexpr und decltype kann man alles in C nachimplementieren.<br />
Und alles in C in Assembler. Und alles Assembler direkt als purer Machinencode.<br />
Aller Programmiersprachen sind Syntax Sugar, das ist der Sinn von ihnen!</p>
</blockquote>
<p>Ja, schon <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>Aber dann ist der Begriff Syntax Sugar halt auch völlig sinnentleert und sagt letztendlich gar nichts aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414004</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414004</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Mon, 18 Aug 2014 18:59:36 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Tue, 19 Aug 2014 08:06:58 GMT]]></title><description><![CDATA[<p>Die einzigen Möglichkeiten von einem Ausdruck* auf einen Typ zu kommen sind in C++03 folgende:</p>
<ul>
<li>Der Ausdruck ist ein konstanter Ausdruck (Irgendein Zeiger, Integral oder Enumerator) und wird an ein Template als non-type-Argument übergeben.</li>
<li>Es wird <code>sizeof</code> auf den Ausdruck angewandt - und dann Schritt 1.</li>
</ul>
<p>Durch den zweiten Punkt wird <code>BOOST_TYPEOF</code> realisiert.</p>
<p>Es ist also leider unmöglich so etwas einfach und portabel in C++03 umzusetzen.</p>
<p>* Damit ist eine <em>expression</em> gemeint wie sie in der Standardgrammatik definiert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414096</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414096</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 19 Aug 2014 08:06:58 GMT</pubDate></item><item><title><![CDATA[Reply to ADL und Rückgabewerte on Wed, 20 Aug 2014 17:43:27 GMT]]></title><description><![CDATA[<p>Arcoth, was ist mit deinem Post über Karsten Ahnert geschehen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2414355</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2414355</guid><dc:creator><![CDATA[Forentroll]]></dc:creator><pubDate>Wed, 20 Aug 2014 17:43:27 GMT</pubDate></item></channel></rss>