<?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[T() oder static_cast&amp;lt;T&amp;gt;() ?]]></title><description><![CDATA[<p>Hallo,</p>
<p>mal eine Frage bezüglich templates, angenommen ich hab so eine Funktion:</p>
<pre><code>template &lt;typename T&gt;
void foo(T t) {
    T value1 = T(1); // Variante 1
    T value2 = static_cast&lt;T&gt;(1); // Variante 2
}
</code></pre>
<p>Welchen der beiden Varianten ist der Vorzug zu geben (und warum)?</p>
<p>Bis jetzt habe ich nämlich immer Variante 1 benutzt, da kürzer und ohne cast. Allerdings hab ich gesehen dass einige Funktionen in <code>boost</code> die zweite Variante benutzen und daher bin ich mir jetzt unsicher.</p>
<p>Macht das überhaupt einen Unterschied oder ist es nur Geschmacksache?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/328438/t-oder-static_cast-lt-t-gt</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 17:18:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/328438.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Oct 2014 21:14:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to T() oder static_cast&amp;lt;T&amp;gt;() ? on Thu, 09 Oct 2014 21:15:19 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>mal eine Frage bezüglich templates, angenommen ich hab so eine Funktion:</p>
<pre><code>template &lt;typename T&gt;
void foo(T t) {
    T value1 = T(1); // Variante 1
    T value2 = static_cast&lt;T&gt;(1); // Variante 2
}
</code></pre>
<p>Welchen der beiden Varianten ist der Vorzug zu geben (und warum)?</p>
<p>Bis jetzt habe ich nämlich immer Variante 1 benutzt, da kürzer und ohne cast. Allerdings hab ich gesehen dass einige Funktionen in <code>boost</code> die zweite Variante benutzen und daher bin ich mir jetzt unsicher.</p>
<p>Macht das überhaupt einen Unterschied oder ist es nur Geschmacksache?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421532</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Thu, 09 Oct 2014 21:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to T() oder static_cast&amp;lt;T&amp;gt;() ? on Thu, 09 Oct 2014 21:22:02 GMT]]></title><description><![CDATA[<p>Der functional-cast T() ist für primitive Typen mit dem C-Cast (T) identisch und kann daher mehr als ein static_cast, z.B. Pointer nach int und solche Scherze.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421534</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Thu, 09 Oct 2014 21:22:02 GMT</pubDate></item><item><title><![CDATA[Reply to T() oder static_cast&amp;lt;T&amp;gt;() ? on Thu, 09 Oct 2014 21:34:41 GMT]]></title><description><![CDATA[<blockquote>
<p>Welchen der beiden Varianten ist der Vorzug zu geben (und warum)?</p>
</blockquote>
<p>Dass man eine Variable anders initialisiert ist dir hoffentlich klar.</p>
<p>Angenommen du müsstest einen Ausdruck in einen anderen Typ casten.<br />
Für <code>T(e)</code> (wobei <code>e</code> ein Ausdruck ist) gelten die folgenden Regeln:</p>
<p>[expr.type.conv]/1 schrieb:</p>
<blockquote>
<p>If the expression list is a single expression, the type conversion expression is equivalent (in definedness, and if defined in meaning) to the corresponding cast expression (5.4).</p>
</blockquote>
<p>Die &quot;corresponding casting expression&quot; ist einfach ein c-style Cast, also <code>(T)e</code> . Und ein solcher Cast ist zum ersten gültigen Cast in der folgenden Liste äquivalent:</p>
<ul>
<li><code>static_cast</code></li>
<li><code>static_cast</code> und <code>const_cast</code></li>
<li><code>reinterpret_cast</code></li>
<li><code>reinterpret_cast</code> und <code>const_cast</code></li>
</ul>
<p>Daher ist <code>T(e)</code> allgemeiner als <code>static_cast&lt;T&gt;(e)</code> , es kann einen <code>const_cast</code> implizieren und <code>reinterpret_cast</code> anwenden. Und das kann in Template-Code zu Problemen führen - aber auch <strong>nur</strong> wenn Zeiger im Spiel sind. Solange <code>T</code> ein Klassentyp oder ein arithmetischer Typ ist sind beide Formen äquivalent und <code>T(...)</code> ist vorzuziehen. Und wenn mehrere Ausdrücke als Initializer dienen (bspw. für einen Konstruktoraufruf) kannst du nur functional-style casts verwenden. Wenn ich weiß dass <code>T</code> arithmetisch ist schreibe ich natürlich <code>T(1)</code> . Wozu <code>static_cast</code> ? Ist dasselbe mit mehr Schreibaufwand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421536</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421536</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 09 Oct 2014 21:34:41 GMT</pubDate></item><item><title><![CDATA[Reply to T() oder static_cast&amp;lt;T&amp;gt;() ? on Thu, 09 Oct 2014 21:29:59 GMT]]></title><description><![CDATA[<p>Ich bevorzuge <code>static_cast&lt;T&gt;(u)</code> .<br />
Warum: was Bashar geschrieben hat. Und da die &quot;Macht&quot; des C-Style Casts meist unerwünscht ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421537</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Thu, 09 Oct 2014 21:29:59 GMT</pubDate></item><item><title><![CDATA[Reply to T() oder static_cast&amp;lt;T&amp;gt;() ? on Thu, 09 Oct 2014 21:54:00 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Dass man eine Variable anders initialisiert ist dir hoffentlich klar.</p>
</blockquote>
<p>Warum macht boost dann sowas?</p>
<pre><code>const value_type a = static_cast&lt;value_type&gt; ( 1 ) / static_cast&lt;value_type&gt;( 2 );
</code></pre>
<p>Ich dachte T(x) ruft ganz normal (und ohne cast) den Konstruktor auf, wusste nicht dass das äquivalent tu (T)x ist... das ist natürlich blöd. Warum macht man denn hier so eine Ausnahme für &quot;single expressions&quot;?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421540</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Thu, 09 Oct 2014 21:54:00 GMT</pubDate></item><item><title><![CDATA[Reply to T() oder static_cast&amp;lt;T&amp;gt;() ? on Thu, 09 Oct 2014 22:06:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich dachte T(x) ruft ganz normal (und ohne cast) den Konstruktor auf, wusste nicht dass das äquivalent tu (T)x ist</p>
</blockquote>
<p>Ja, aber <code>(T)x</code> ist doch für Klassen äquivalent zu <code>static_cast&lt;T&gt;(x)</code> ! Lies meine Posts bis zum Ende durch.</p>
<pre><code>const value_type a = static_cast&lt;value_type&gt; ( 1 ) / static_cast&lt;value_type&gt;( 2 );
</code></pre>
<p>Das ist nicht dieselbe Form wie in deinem Posting. In deinem Post war ein einziger Cast der gesamte Initializer. Hier ist der Initializer ein Ausdruck mit zwei Casts, den kann man natürlich nicht vereinfachen. Allerdings gibt es keinen Grund die Initialisierung in deinem Post zu</p>
<pre><code>T value1(1);
</code></pre>
<p>vereinfachen.</p>
<blockquote>
<p>Warum macht boost dann sowas?</p>
</blockquote>
<p>Höchstwahrscheinlich nutzen die static_cast weil es entweder so in den Richtlinien steht, sie Casts im Code finden wollen ( <code>static_cast</code> ist leicht zu suchen), etc. etc. Hier wird es genau dasselbe wie <code>value_type(1)</code> bewirken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2421541</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421541</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 09 Oct 2014 22:06:33 GMT</pubDate></item><item><title><![CDATA[Reply to T() oder static_cast&amp;lt;T&amp;gt;() ? on Thu, 09 Oct 2014 22:20:52 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Ja, aber <code>(T)x</code> ist doch für Klassen äquivalent zu <code>static_cast&lt;T&gt;(x)</code> ! Lies meine Posts bis zum Ende durch.</p>
</blockquote>
<p>Schon klar, wie gesagt ich dachte es wäre anders <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>Arcoth schrieb:</p>
<blockquote>
<p>Das ist nicht dieselbe Form wie in deinem Posting. In deinem Post war ein einziger Cast der gesamte Initializer. Hier ist der Initializer ein Ausdruck mit zwei Casts, den kann man natürlich nicht vereinfachen.</p>
</blockquote>
<p>Hm Ok.</p>
<p>Arcoth schrieb:</p>
<blockquote>
<p>Höchstwahrscheinlich nutzen die static_cast weil es entweder so in den Richtlinien steht, sie Casts im Code finden wollen ( <code>static_cast</code> ist leicht zu suchen), etc. etc. Hier wird es genau dasselbe wie <code>value_type(1)</code> bewirken.</p>
</blockquote>
<p>Ok gut, alles klar. Wieder was gelernt <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/2421542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421542</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Thu, 09 Oct 2014 22:20:52 GMT</pubDate></item><item><title><![CDATA[Reply to T() oder static_cast&amp;lt;T&amp;gt;() ? on Thu, 09 Oct 2014 22:36:24 GMT]]></title><description><![CDATA[<p>happystudent schrieb:</p>
<blockquote>
<p>Schon klar, wie gesagt ich dachte es wäre anders <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>
</blockquote>
<p>Ich verstehe jetzt erst was dein Satz bedeutet: Du wusstest nicht dass <code>T(x)</code> über <code>(T)x</code> und schließlich <code>static_cast</code> den Konstruktor aufruft, sondern direkt. Das habe ich zuerst missverstanden. <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/2421543</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421543</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 09 Oct 2014 22:36:24 GMT</pubDate></item><item><title><![CDATA[Reply to T() oder static_cast&amp;lt;T&amp;gt;() ? on Thu, 09 Oct 2014 22:43:56 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>Ich verstehe jetzt erst was dein Satz bedeutet: Du wusstest nicht dass <code>T(x)</code> über <code>(T)x</code> und schließlich <code>static_cast</code> den Konstruktor aufruft, sondern direkt. Das habe ich zuerst missverstanden. <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>
</blockquote>
<p>Kein Problem <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/2421544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2421544</guid><dc:creator><![CDATA[happystudent]]></dc:creator><pubDate>Thu, 09 Oct 2014 22:43:56 GMT</pubDate></item></channel></rss>