<?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[Decltype Deklaration]]></title><description><![CDATA[<p>Kurze Frage:</p>
<p>Kann mir jemand sagen, was folgende Deklaration zu bedeuten hat?</p>
<pre><code class="language-cpp">template&lt;class T, class U&gt; decltype((*(T*)0)+(*(U*)0)) add(T t, U u)
</code></pre>
<p>Es handelt sich um einen duch VS2010 unterstützten C++0x Code. Was decltype macht ist mir im allgemeinen klar, aber was hat (<em>(T</em>)0) zu bedeuteten?</p>
<p>Danke im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270569/decltype-deklaration</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 02:25:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270569.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 14 Jul 2010 15:42:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Decltype Deklaration on Wed, 14 Jul 2010 15:42:51 GMT]]></title><description><![CDATA[<p>Kurze Frage:</p>
<p>Kann mir jemand sagen, was folgende Deklaration zu bedeuten hat?</p>
<pre><code class="language-cpp">template&lt;class T, class U&gt; decltype((*(T*)0)+(*(U*)0)) add(T t, U u)
</code></pre>
<p>Es handelt sich um einen duch VS2010 unterstützten C++0x Code. Was decltype macht ist mir im allgemeinen klar, aber was hat (<em>(T</em>)0) zu bedeuteten?</p>
<p>Danke im voraus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926282</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 14 Jul 2010 15:42:51 GMT</pubDate></item><item><title><![CDATA[Reply to Decltype Deklaration on Wed, 14 Jul 2010 15:43:56 GMT]]></title><description><![CDATA[<p>Pointer to T-Pointer.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926284</guid><dc:creator><![CDATA[Heimelchen]]></dc:creator><pubDate>Wed, 14 Jul 2010 15:43:56 GMT</pubDate></item><item><title><![CDATA[Reply to Decltype Deklaration on Wed, 14 Jul 2010 15:47:32 GMT]]></title><description><![CDATA[<p>(T*)0 ist ein Zeiger auf T mit dem wert NULL.<br />
<em>(T</em>)0 ist das Objekt vom Typ T, was dort liegt (wobei auf Adresse 0 kein Objekt liegen darf).</p>
<p>cout&lt;&lt;(<em>(T</em>)0) oder sowas führt natürlich sofort zu einer Schutzverletzung. Aber im decltype wird ja nur der Typ gebastelt, da geht das mal.</p>
<p>Der Code macht also nur</p>
<pre><code class="language-cpp">template&lt;class T, class U&gt; decltype(T()+U()) add(T t, U u)
</code></pre>
<p>, nur ein wenig besser, weil mein Code verlangt, daß T und U einen Standardkonstruktor haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926286</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926286</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 14 Jul 2010 15:47:32 GMT</pubDate></item><item><title><![CDATA[Reply to Decltype Deklaration on Wed, 14 Jul 2010 15:48:27 GMT]]></title><description><![CDATA[<p>Das soll das gleiche bewirken wie</p>
<pre><code class="language-cpp">template &lt;class T, class U&gt;
auto add(T t, U u) -&gt; decltype(t + u);
</code></pre>
<p>Aus irgendeinem Grund benutzt der Schreiber aber nicht t und u, sondern macht sich Variablen aus Nullzeigern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926287</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926287</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Wed, 14 Jul 2010 15:48:27 GMT</pubDate></item><item><title><![CDATA[Reply to Decltype Deklaration on Wed, 14 Jul 2010 16:14:12 GMT]]></title><description><![CDATA[<p>Was macht &quot;-&gt;&quot; Operator da?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926293</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 14 Jul 2010 16:14:12 GMT</pubDate></item><item><title><![CDATA[Reply to Decltype Deklaration on Wed, 14 Jul 2010 16:17:29 GMT]]></title><description><![CDATA[<p>Dass ist nicht der Pfeil-Operator, sondern eine neue Form der Funktionsdeklaration in C++0x. Er wird benötigt, da der Compiler hiermit nicht klarkommt:</p>
<pre><code class="language-cpp">template &lt;class T, class U&gt;
decltype(t + u) add(T t, U u);
       ^
       +------------------------------------ Was sind &quot;t&quot; und &quot;u&quot;?
</code></pre>
<p>Deshalb nun diese neue Syntax.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926295</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926295</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Wed, 14 Jul 2010 16:17:29 GMT</pubDate></item><item><title><![CDATA[Reply to Decltype Deklaration on Wed, 14 Jul 2010 16:18:19 GMT]]></title><description><![CDATA[<p>Alternativ wird es ein Template <code>declval</code> geben, mit dem man sich Werte/Objekte aus dem Nichts zaubern kann, zwecks Bauen eines Ausdrucks für decltype.</p>
<pre><code class="language-cpp">#include &lt;utility&gt;
...
using std::declval;
...
decltype( declval&lt;int&gt;() + declval&lt;double&gt;() ) blah;
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/20434">@FrEEzE2046</a>: Mit der auto...-&gt; Syntax kann man Funktionen deklarieren/definieren. Nach -&gt; kommt der Rückgabetyp, welcher sich so verzögern lässt. So ist dem Compiler auch bekannt, was t und u ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926296</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 14 Jul 2010 16:18:19 GMT</pubDate></item><item><title><![CDATA[Reply to Decltype Deklaration on Wed, 14 Jul 2010 16:24:17 GMT]]></title><description><![CDATA[<p>Danke für eure Antworten. Ich hatte leider noch keine Zeit mich intensiver einzulesen.</p>
<p>Noch schnell die Frage:<br />
Wofür wird das std::forward im Body benötigt? Reicht nicht return t + u;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926298</guid><dc:creator><![CDATA[FrEEzE2046]]></dc:creator><pubDate>Wed, 14 Jul 2010 16:24:17 GMT</pubDate></item><item><title><![CDATA[Reply to Decltype Deklaration on Wed, 14 Jul 2010 18:44:55 GMT]]></title><description><![CDATA[<p>FrEEzE2046 schrieb:</p>
<blockquote>
<p>Wofür wird das std::forward im Body benötigt? Reicht nicht return t + u;?</p>
</blockquote>
<p>Ich sehe in diesem Thread kein Beispiel mit std::forward. (!)</p>
<p>std::forward ist eigentlich dazu da, die &quot;ürsprüngliche value-ness&quot; wieder herzustellen. Es gibt Lvalue- und Rvalue-Ausdrücke. Zusammen mit Rvalue-Referenzen und einer speziellen Typ-Deduktionsregel erlaubt C++0x sogenanntes &quot;perfect forwarding&quot;. std::forward ist eine Hilfsfunktion dafür.</p>
<pre><code class="language-cpp">void foo(int const&amp;); // frisst lvalue-ausdrücke
void foo(int     &amp;&amp;); // frisst non-const rvalue ausdrücke

template &lt;typename T&gt;
void forwardor(T &amp;&amp; x)
{
  foo( std::forward&lt;T&gt;(x) );
}

int main()
{
  int i = 23;
  forwardor(i);   // ruft foo(int const&amp;) auf, da T=int&amp;
  forwardor(i+1); // ruft foo(int     &amp;&amp;) auf, da T=int
}
</code></pre>
<p>Die &quot;value-ness&quot; (L oder R) des Arguments bleibt in Form des Typ-Parameters T erhalten.</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1926335</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1926335</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Wed, 14 Jul 2010 18:44:55 GMT</pubDate></item></channel></rss>