<?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[Wozu decltype, wenn man auto hat?]]></title><description><![CDATA[<p>Wozu decltype, wenn man auto hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/297043/wozu-decltype-wenn-man-auto-hat</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 05:28:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297043.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 17 Dec 2011 20:54:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sat, 17 Dec 2011 20:54:57 GMT]]></title><description><![CDATA[<p>Wozu decltype, wenn man auto hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158166</guid><dc:creator><![CDATA[c+++++++++]]></dc:creator><pubDate>Sat, 17 Dec 2011 20:54:57 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sat, 17 Dec 2011 20:59:49 GMT]]></title><description><![CDATA[<p>c+++++++++ schrieb:</p>
<blockquote>
<p>Wozu decltype, wenn man auto hat?</p>
</blockquote>
<p>Für nutzliche typedefs.<br />
Kannst ja nur lokale Variablen autoen. Attribute nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158167</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 17 Dec 2011 20:59:49 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 00:47:27 GMT]]></title><description><![CDATA[<p>Das Schlüsselwort <code>decltype</code> ist viel mächtiger als <code>auto</code> , treffender wäre also die Frage &quot;wozu <code>auto</code> , wenn man <code>decltype</code> hat?&quot;</p>
<p>Letzteres besteht ja primär aus Syntaxgründen, prinzipiell könnte man folgendes Makro definieren:</p>
<pre><code class="language-cpp">#define AUTO(var, expr) decltype(expr) var = expr;
</code></pre>
<p>Und dann wird <code>auto</code> noch für die neue Funktionsdeklaration eingesetzt. Sonst noch irgendwo?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158223</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158223</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 18 Dec 2011 00:47:27 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 08:21:02 GMT]]></title><description><![CDATA[<p>Um es noch einmal zu sagen:</p>
<pre><code class="language-cpp">int main()
{
	long double test(.0);
	auto n(test);//Wirklich nichts anderes als
	decltype(test) g(test);
}
</code></pre>
<p>auto ist aber so gesehen etwas besser, da:</p>
<pre><code class="language-cpp">int main()
{
	std::vector&lt;int&gt; a;
        decltype(a.begin()) iter(a.begin());
        auto iter_(a.begin());
}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>: Kannst du mir einen Link für das mit der Funktionsdeklaration geben? :xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158249</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 18 Dec 2011 08:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 08:26:02 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Letzteres besteht ja primär aus Syntaxgründen, prinzipiell könnte man folgendes Makro definieren:</p>
<pre><code class="language-cpp">#define AUTO(var, expr) decltype(expr) var = expr;
</code></pre>
</blockquote>
<p>Damit funktioniert aber folgendes nicht</p>
<pre><code class="language-cpp">AUTO fun = [](int x, int y){return x+y;}
</code></pre>
<p>und auch das nicht</p>
<pre><code class="language-cpp">AUTO dings = {2,3,5,7,11,13,17,19,23,29};
</code></pre>
<p>und dann ist auto ja auch nur ein Typ-Platzhalter, der entsprechend dekoriert werden kann:</p>
<pre><code class="language-cpp">vector&lt;auto&gt; blah = myfunction();
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">auto const&amp; x = binky();
</code></pre>
<p>Kurz um: Mit auto kann man decltype nicht emulieren. Mit decltype kann man auto nicht emulieren. Damit wär die Frage beantwortet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158252</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158252</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 18 Dec 2011 08:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 08:37:44 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">vector&lt;auto&gt; blah = myfunction();
</code></pre>
</blockquote>
<p><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="😮"
    /><br />
Oh, den kannte ich noch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158254</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 18 Dec 2011 08:37:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 08:43:05 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">constexpr int binky(){return 5;}

int main()
{
	decltype(binky()) const&amp; x = binky();
}
</code></pre>
<p>:xmas1: :xmas2:</p>
<p>volkard schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">vector&lt;auto&gt; blah = myfunction();
</code></pre>
</blockquote>
<p><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="😮"
    /><br />
Oh, den kannte ich noch nicht.</p>
</blockquote>
<p><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/2158255</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158255</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 18 Dec 2011 08:43:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 09:00:10 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>Damit funktioniert aber folgendes nicht</p>
<pre><code class="language-cpp">AUTO fun = [](int x, int y){return x+y;}
</code></pre>
<p>und auch das nicht</p>
<pre><code class="language-cpp">AUTO dings = {2,3,5,7,11,13,17,19,23,29};
</code></pre>
</blockquote>
<p>Man müsste <code>AUTO(var, expr)</code> statt <code>AUTO var = expr</code> schreiben... Und eventuell Klammern oder Variadic Macros wegen der Kommas verwenden. Oder meinst du, auch das geht nicht? Falls ja, weshalb? Kann man <code>decltype</code> nicht auf Lambdas oder Initialisierungslisten anwenden?</p>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>und dann ist auto ja auch nur ein Typ-Platzhalter, der entsprechend dekoriert werden kann:</p>
<pre><code class="language-cpp">vector&lt;auto&gt; blah = myfunction();
</code></pre>
</blockquote>
<p>Ah, das kannte ich ebenfalls nicht. Interessant! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158259</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 18 Dec 2011 09:00:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 09:08:39 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>und dann ist auto ja auch nur ein Typ-Platzhalter, der entsprechend dekoriert werden kann:</p>
<pre><code class="language-cpp">vector&lt;auto&gt; blah = myfunction();
</code></pre>
</blockquote>
<p>Ah, das kannte ich ebenfalls nicht. Interessant! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
</blockquote>
<p>Naja, gcc kennt das auch nicht.<br />
Ist es wirklich erlaubt?</p>
<p>Außerdem habe ich Angst vor</p>
<pre><code class="language-cpp">auto&lt;auto&gt; blah = myfunction();
</code></pre>
<p>:xmas2:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158260</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158260</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 18 Dec 2011 09:08:39 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 09:37:11 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/12954">@Nexus</a>:<br />
Ein Lambdaausdruck darf nicht innerhalb sizeof und decltype auftauchen. Und da {2,3,5,7} kein richtiger Ausdruck ist, klappt hier decltype auch nicht. Aber für auto gibt es eine Sonderregel:</p>
<pre><code class="language-cpp">auto list = {2,3,5,7,11};
// decltype(list) -&gt; std::initializer_list&lt;int&gt;
</code></pre>
<p>Damit funktioniert dann auch das hier:</p>
<pre><code class="language-cpp">for (int x : {2,3,5,7,11}) {
  cout &lt;&lt; x &lt;&lt; endl;
}
</code></pre>
<p>weil hier hinter der Kulisse so auto verwendet wird:</p>
<pre><code class="language-cpp">{
  auto &amp;&amp; __range = {2,3,5,7,11};
  for (auto it = begin(__range), ee = end(__range);
       it != ee; ++it)
  {
    int x = *it;
    cout &lt;&lt; x &lt;&lt; endl;
  }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2158261</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158261</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 18 Dec 2011 09:37:11 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 09:49:31 GMT]]></title><description><![CDATA[<p>Danke für die Erklärung.</p>
<p>Warum die Regel, dass man kein <code>decltype</code> auf Lambdas und Initializer-Lists anwenden kann? Indirekt kommt man durch Variablen sowieso an den Typen.</p>
<p>Und wieso ist <code>{2,3,5,7}</code> kein richtiger Ausdruck? Weil es unter Anderem als Argumentliste für den Konstruktor oder als Aggregat-Initialisierungsliste verwendet werden kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158264</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 18 Dec 2011 09:49:31 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 11:30:26 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">{
  auto &amp;&amp; __range = {2,3,5,7,11};
  int x;
  for (auto it = begin(__range);it != end(__range); ++it)
  {
    x = *it;
    cout &lt;&lt; *it &lt;&lt; '\n';
  }
}
</code></pre>
<p>1. Ist es so schlimm, wenn end() immer wieder aufgerufen werden muss?<br />
2. Wird x nicht globaler deklariert?</p>
<p>Edit: ach ja, und- was genau ist end()? Kann dazu nichts finden... findet es das Ende eines C-Arrays, oder wa?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158285</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 18 Dec 2011 11:30:26 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 11:39:10 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Edit: ach ja, und- was genau ist end()? Kann dazu nichts finden... findet es das Ende eines C-Arrays, oder wa?</p>
</blockquote>
<p>Ja. Und bei normalen Containern ruft es cont.end() auf. Ganz automatisch. Wohl mit SFINAE implelentiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158289</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158289</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 18 Dec 2011 11:39:10 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 11:42:46 GMT]]></title><description><![CDATA[<blockquote>
<p>Edit: ach ja, und- was genau ist end()? Kann dazu nichts finden... findet es das Ende eines C-Arrays, oder wa?</p>
</blockquote>
<p>Schau mal hier: <a href="http://en.cppreference.com/w/cpp/iterator/end" rel="nofollow">http://en.cppreference.com/w/cpp/iterator/end</a></p>
<p>Das sollte dir weiterhelfen <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/2158291</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158291</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sun, 18 Dec 2011 11:42:46 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 11:51:50 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Danke für die Erklärung.</p>
<p>Warum die Regel, dass man kein <code>decltype</code> auf Lambdas und Initializer-Lists anwenden kann? Indirekt kommt man durch Variablen sowieso an den Typen.</p>
<p>Und wieso ist <code>{2,3,5,7}</code> kein richtiger Ausdruck? Weil es unter Anderem als Argumentliste für den Konstruktor oder als Aggregat-Initialisierungsliste verwendet werden kann?</p>
</blockquote>
<p>Unter anderem das. Außerdem kann man initialiser_list&lt;A&gt; nicht in initialiser_list&lt;B&gt; konvertieren. Andererseits ist</p>
<pre><code class="language-cpp">struct foo { foo(std::initialiser_list&lt;int&gt;); };

foo x = { 'a', 'b' }; // ok
</code></pre>
<p>kein Problem, aus dem Kontext der Initialisierung heraus ergibt sich, dass ein std::initialiser_list&lt;int&gt; benötigt wird.</p>
<p>Hacker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">{
  auto &amp;&amp; __range = {2,3,5,7,11};
  int x;
  for (auto it = begin(__range);it != end(__range); ++it)
  {
    x = *it;
    cout &lt;&lt; *it &lt;&lt; '\n';
  }
}
</code></pre>
<p>1. Ist es so schlimm, wenn end() immer wieder aufgerufen werden muss?<br />
2. Wird x nicht globaler deklariert?</p>
<p>Edit: ach ja, und- was genau ist end()? Kann dazu nichts finden... findet es das Ende eines C-Arrays, oder wa?</p>
</blockquote>
<p>krümelkackers Code sieht wie aus dem Standard kopiert aus. Da __range im allgemeinen Fall des range-based for-loops auch ein normaler Container sein kann, gibt es semantische Unterschiede zwischen beiden Varianten. Da die Spezifikation ist wie sie ist, wird damit ausgedrückt, dass der end-Iterator in einem solchen loop gültig bleiben muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158295</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 18 Dec 2011 11:51:50 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 11:56:27 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Wohl mit SFINAE implelentiert.</p>
</blockquote>
<p><a href="http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error" rel="nofollow">http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error</a>, ganz versteh ich das noch nicht. Also, man kann beliebige Template-Parameter übergeben, und es kommt zu keinem Fehler?</p>
<pre><code class="language-cpp">struct Test {
    typedef int foo;
};

template &lt;typename T&gt; 
void f(typename T::foo) {} // Definition #1

template &lt;typename T&gt; 
void f(T) {}                // Definition #2

int main() {
    f&lt;Test&gt;(10); // Call #1.
    f&lt;int&gt;(10);  // Call #2. Without error (even though there is no int::foo) thanks to SFINAE.
}
</code></pre>
<p>Das verwirrt mich aufs extremste...T::foo gibt es ja sowieso nur bei Test, oder etwa nicht? also müsste bei Call#1 Def#1 und bei Call#2 entsprechen Def#2 aufgerufen werden? Logischerweise?</p>
<p>:xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158297</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158297</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 18 Dec 2011 11:56:27 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 12:33:08 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Warum die Regel, dass man kein <code>decltype</code> auf Lambdas und Initializer-Lists anwenden kann?</p>
</blockquote>
<p>Jedes Lambda hat seinen eigenen Typ, egal, ob es völlig mit einem anderen Lambda übereinstimmt oder nicht. Sonst müsste der Compiler in der Funtkion alle Lambdas auf Äquivalenz untersuchen und ggf. zusammenfügen. Und weil in dem AUTO()-Makro eben zwei Lambdas vorkommen, die zwar äquivalent sind, aber vom Compiler nicht als solche erkannt werden (müssen), gibt es keinen Ausdruck, den du rechts hinschreiben könntest, um den Typ des decltypes links zu bekommen.</p>
<p>(Alle Angaben ohne Gewähr)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158304</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158304</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 18 Dec 2011 12:33:08 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Sun, 18 Dec 2011 12:37:33 GMT]]></title><description><![CDATA[<p>@Hacker: Richtig. SFINAE hat viel mit Template-Spezialisierung und Fallunterscheidung zu tun. Dein Programm, das du richtig analysiert hast, ist noch die einfache Variante. Kompliziertere Varianten benutzen Funktionen/Klassen, die für verschiedene Typen überladen/spezialisiert sind und verschiedene Rückgabetypen mit verschiedenen Größen haben, werten dann die Größe des Rückgabetyps für die Überladung, die der Compiler für den gegebenen Typ auswählt, aus und benutzen je nach Größe eine unterschiedliche Klassenspezialisierung.</p>
<p>Schau dir auch mal Type Traits wie z.B. std::is_base_of, std::is_same, std::is_integral o.ä. an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158307</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158307</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sun, 18 Dec 2011 12:37:33 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Mon, 19 Dec 2011 08:47:06 GMT]]></title><description><![CDATA[<p>Hacker schrieb:</p>
<blockquote>
<p>Das verwirrt mich aufs extremste...T::foo gibt es ja sowieso nur bei Test, oder etwa nicht? also müsste bei Call#1 Def#1 und bei Call#2 entsprechen Def#2 aufgerufen werden? Logischerweise?</p>
</blockquote>
<p>Ganz logisch ist das nicht. Wenn der Standard SFINAE nicht definieren wuerde, wuerde der compiler beim 2. fall versuchen int::foo zu erzeugen und einen Fehler schmeissen. Durch SFNIAE wird dem compiler aber mitgeteilt: wenn es int::foo nicht gibt, ignoriere das erstmal und such nach einer anderen Version der Funktion, die funktioniert. Das ist der Kern der Regel.</p>
<p>In diesem Fall wird SFINAE angesprochen, weil man damit gezielt funktionen ausschalten kann, wenn der Templateparameter ebstimmte Eigenschaften hat.</p>
<p>Zum Beispiel kannst du sowas machen:</p>
<pre><code class="language-cpp">template&lt;bool T&gt;
struct TriggerSFINAE{};
template&lt;&gt;
struct TriggerSFINAE&lt;true&gt;{typedef int* type;};

template&lt;class T&gt;
struct IsArithmetic{
    static const bool value = false;
};
template&lt;&gt;
struct IsArithmetic&lt;double&gt;{
    static const bool value = true;
};
...

//und dann sowas wie:

//die funktion soll nur auf arithmetischen typen funktionieren:
template&lt;class T&gt;
void foo(T t,typename TriggerSFINAE&lt;IsArithmetic&lt;T&gt;::value&gt;::type t = nullptr){
    std::cout&lt;&lt;&quot;ist arithmetisch&quot;;
}
//hier ne implementation die sonst aufgerufen wird:
void foo(T t,typename TriggerSFINAE&lt;!IsArithmetic&lt;T&gt;::value&gt;::type t = nullptr){
    std::cout&lt;&lt;&quot;ist nicht arithmetisch&quot;;
}
</code></pre>
<p>Das ist besonders sinnvoll, wenn der Funktionsaufruf sonst mehrdeutig waer, also von der Parameterliste beide Versionen passen wuerden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158616</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Mon, 19 Dec 2011 08:47:06 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Mon, 19 Dec 2011 20:46:01 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<p>Hacker schrieb:</p>
<blockquote>
<p>Das verwirrt mich aufs extremste...T::foo gibt es ja sowieso nur bei Test, oder etwa nicht? also müsste bei Call#1 Def#1 und bei Call#2 entsprechen Def#2 aufgerufen werden? Logischerweise?</p>
</blockquote>
<p>Ganz logisch ist das nicht. Wenn der Standard SFINAE nicht definieren wuerde, wuerde der compiler beim 2. fall versuchen int::foo zu erzeugen und einen Fehler schmeissen. Durch SFNIAE wird dem compiler aber mitgeteilt: wenn es int::foo nicht gibt, ignoriere das erstmal und such nach einer anderen Version der Funktion, die funktioniert. Das ist der Kern der Regel.</p>
</blockquote>
<p>Ah, jetzt verstehe ich etwas. Das Problem ist, ich dachte dass eben das <strong>selbstverständlich</strong> ist, weshalb ich zuerst dachte, SFINAE sei irgendeine Erweiterung <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>:xmas1:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2158982</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2158982</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 19 Dec 2011 20:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Tue, 20 Dec 2011 00:04:12 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>krümelkacker schrieb:</p>
<blockquote>
<p>und dann ist auto ja auch nur ein Typ-Platzhalter, der entsprechend dekoriert werden kann:</p>
<pre><code class="language-cpp">vector&lt;auto&gt; blah = myfunction();
</code></pre>
</blockquote>
<p>Ah, das kannte ich ebenfalls nicht. Interessant! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f4a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--light_bulb"
      title=":bulb:"
      alt="💡"
    /></p>
</blockquote>
<p>Naja, gcc kennt das auch nicht.<br />
Ist es wirklich erlaubt?</p>
</blockquote>
<p>Das würde mich auch wunder nehmen. Konnte auf die schnelle nichts im Standard finden.</p>
<p>Dafür habe ich etwas anderes gefunden, was ich noch nicht kannte:</p>
<pre><code class="language-cpp">auto x = new auto('c');
</code></pre>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2159059</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2159059</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 20 Dec 2011 00:04:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu decltype, wenn man auto hat? on Tue, 20 Dec 2011 01:11:17 GMT]]></title><description><![CDATA[<p>Der - für mich - naheliegendste Grund warum decltype gebraucht wird wurde noch nicht genannt (oder ich hab's übersehen):<br />
Mit <code>auto</code> kann man keine Return-Typen zusammenbauen.<br />
Mit <code>decltype</code> dagegen schon.</p>
<pre><code class="language-cpp">auto Foo() -&gt; decltype(A() + B());
</code></pre>
<p>Bzw. allgemein überall wo man den Typ eines Ausdrucks bestimmen will ohne gleich eine Variable zu definieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2159065</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2159065</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 20 Dec 2011 01:11:17 GMT</pubDate></item></channel></rss>