<?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[Die &amp;quot;Uniform&amp;quot; Initialization besser vermeiden]]></title><description><![CDATA[<p>Ich hoffe, dieses Forum hier wird in Zukunft von der so genannten &quot;einheitlichen&quot; Initialisierung in Zukunft abraten.</p>
<p>Es gibt da viele Beispiele, weshalb dieses &quot;einheitliche&quot; ein Riesenschwindel ist.</p>
<p>Zwar gibt es noch etliche ihr bezügliche Bugs im Standard (<a href="http://www.c-plusplus.net/forum/312328" rel="nofollow">ein Fund von Kellerautomat</a>, <a href="http://www.c-plusplus.net/forum/p2249234#2249234" rel="nofollow">einer von Camper</a> und viele mehr), die in Spezialfällen zu Problemen führen, was aber kein Grund ist, davon abzuraten.</p>
<p>Vielmehr stört mich, dass die Semantik einfach kaputt ist.</p>
<ol>
<li>Als Einführung das Standardbeispiel mit <code>std::vector&lt;int&gt;</code></li>
</ol>
<pre><code class="language-cpp">template &lt;typename T&gt; void f() { std::vector&lt;T&gt; v{42}; }
</code></pre>
<p>Hier kann der Vektor die Grösse 42 oder 1 haben, abhängig davon, welche Konstruktoren T besitzt.</p>
<ol>
<li>Verschiedene Versuche, einen T zu kopieren:</li>
</ol>
<pre><code class="language-cpp">T kopie       {original};
T copia    =  {original};
T copiar   = T{original};
auto copie = T{original};
auto kopieer  {original};
auto copy  =  {original};
</code></pre>
<p>Alle sechs sind falsch, die ersten vier z.B. bei <code>std::array</code> , die letzten beiden machen etwas anderes.</p>
<ol>
<li>Wer toll findet, dass man jetzt Funktionsaufrufe vereinfachen kann:</li>
</ol>
<pre><code class="language-cpp">void f(std::string);
f({&quot;a&quot;}); // Hach, wie kompakt das ist
</code></pre>
<p>Das funktioniert allerdings schon nicht mehr, wenn die Funktion überladen wird:</p>
<pre><code class="language-cpp">void f(std::string);
void f(std::vector&lt;std::string&gt;);
f({&quot;a&quot;}); // Knall
</code></pre>
<p>Im Klartext heisst das, Funktionen nachträglich zu überladen macht fremden Code kaputt.</p>
<ol>
<li>Hier noch einmal das erste Beispiel:</li>
</ol>
<pre><code class="language-cpp">template &lt;typename T&gt; void f() { std::vector&lt;T&gt; v{42}; }
</code></pre>
<p>Wenn <code>std::vector</code> eine eigene Klasse wäre, die noch keine <code>std::initializer_list</code> entgegen nimmt, ist der Code in Ordnung.<br />
Sobald eine hinzugefügt wird, ändert er sein Verhalten und das nicht zum Guten.<br />
Boost wie jede andere Bibliothek dürfte deshalb unter keinen Umständen einen Konstruktor mit einer <code>std::initializer_list</code> hinzufügen, weil sich jetzt schon Konstruktoren mit {} aufrufen lassen.</p>
<p>Hier ein Ausschnitt von Bjarnes FAQ.</p>
<pre><code class="language-cpp">X x{a};
X* p = new X{a};
z = X{a};
f({a});
return {a};
</code></pre>
<p>Nehmen wir an, das ist generischer Template-Code trifft jedes der 4 Argumente trifft zu.<br />
Nehmen wir an, das ist normaler Code, dann treffen Argumente 1 und 2 manchmal zu, weshalb jedesmal kurz überlegt werden muss, ob das hier legal ist.<br />
Unabhängig davon gelten 3 und 4 IMMER, also gibt es hier nichts zu überlegen, denn es gilt: Die &quot;Uniform&quot; Initialization besser vermeiden.</p>
<p>Einwände?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/313618/die-quot-uniform-quot-initialization-besser-vermeiden</link><generator>RSS for Node</generator><lastBuildDate>Sun, 12 Jul 2026 04:09:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/313618.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 05 Feb 2013 21:38:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Die &amp;quot;Uniform&amp;quot; Initialization besser vermeiden on Tue, 05 Feb 2013 21:38:04 GMT]]></title><description><![CDATA[<p>Ich hoffe, dieses Forum hier wird in Zukunft von der so genannten &quot;einheitlichen&quot; Initialisierung in Zukunft abraten.</p>
<p>Es gibt da viele Beispiele, weshalb dieses &quot;einheitliche&quot; ein Riesenschwindel ist.</p>
<p>Zwar gibt es noch etliche ihr bezügliche Bugs im Standard (<a href="http://www.c-plusplus.net/forum/312328" rel="nofollow">ein Fund von Kellerautomat</a>, <a href="http://www.c-plusplus.net/forum/p2249234#2249234" rel="nofollow">einer von Camper</a> und viele mehr), die in Spezialfällen zu Problemen führen, was aber kein Grund ist, davon abzuraten.</p>
<p>Vielmehr stört mich, dass die Semantik einfach kaputt ist.</p>
<ol>
<li>Als Einführung das Standardbeispiel mit <code>std::vector&lt;int&gt;</code></li>
</ol>
<pre><code class="language-cpp">template &lt;typename T&gt; void f() { std::vector&lt;T&gt; v{42}; }
</code></pre>
<p>Hier kann der Vektor die Grösse 42 oder 1 haben, abhängig davon, welche Konstruktoren T besitzt.</p>
<ol>
<li>Verschiedene Versuche, einen T zu kopieren:</li>
</ol>
<pre><code class="language-cpp">T kopie       {original};
T copia    =  {original};
T copiar   = T{original};
auto copie = T{original};
auto kopieer  {original};
auto copy  =  {original};
</code></pre>
<p>Alle sechs sind falsch, die ersten vier z.B. bei <code>std::array</code> , die letzten beiden machen etwas anderes.</p>
<ol>
<li>Wer toll findet, dass man jetzt Funktionsaufrufe vereinfachen kann:</li>
</ol>
<pre><code class="language-cpp">void f(std::string);
f({&quot;a&quot;}); // Hach, wie kompakt das ist
</code></pre>
<p>Das funktioniert allerdings schon nicht mehr, wenn die Funktion überladen wird:</p>
<pre><code class="language-cpp">void f(std::string);
void f(std::vector&lt;std::string&gt;);
f({&quot;a&quot;}); // Knall
</code></pre>
<p>Im Klartext heisst das, Funktionen nachträglich zu überladen macht fremden Code kaputt.</p>
<ol>
<li>Hier noch einmal das erste Beispiel:</li>
</ol>
<pre><code class="language-cpp">template &lt;typename T&gt; void f() { std::vector&lt;T&gt; v{42}; }
</code></pre>
<p>Wenn <code>std::vector</code> eine eigene Klasse wäre, die noch keine <code>std::initializer_list</code> entgegen nimmt, ist der Code in Ordnung.<br />
Sobald eine hinzugefügt wird, ändert er sein Verhalten und das nicht zum Guten.<br />
Boost wie jede andere Bibliothek dürfte deshalb unter keinen Umständen einen Konstruktor mit einer <code>std::initializer_list</code> hinzufügen, weil sich jetzt schon Konstruktoren mit {} aufrufen lassen.</p>
<p>Hier ein Ausschnitt von Bjarnes FAQ.</p>
<pre><code class="language-cpp">X x{a};
X* p = new X{a};
z = X{a};
f({a});
return {a};
</code></pre>
<p>Nehmen wir an, das ist generischer Template-Code trifft jedes der 4 Argumente trifft zu.<br />
Nehmen wir an, das ist normaler Code, dann treffen Argumente 1 und 2 manchmal zu, weshalb jedesmal kurz überlegt werden muss, ob das hier legal ist.<br />
Unabhängig davon gelten 3 und 4 IMMER, also gibt es hier nichts zu überlegen, denn es gilt: Die &quot;Uniform&quot; Initialization besser vermeiden.</p>
<p>Einwände?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296308</guid><dc:creator><![CDATA[templer]]></dc:creator><pubDate>Tue, 05 Feb 2013 21:38:04 GMT</pubDate></item><item><title><![CDATA[Reply to Die &amp;quot;Uniform&amp;quot; Initialization besser vermeiden on Tue, 05 Feb 2013 21:55:14 GMT]]></title><description><![CDATA[<p>Sehr schön. Endlich mal jemand, der das Ganze ähnlich sieht wie ich.</p>
<p>Hier meine Ausführungen, die erste davon vor ziemlich genau zwei Jahren:<br />
<a href="http://www.c-plusplus.net/forum/p2017868#2017868" rel="nofollow">http://www.c-plusplus.net/forum/p2017868#2017868</a><br />
<a href="http://www.c-plusplus.net/forum/p2187510#2187510" rel="nofollow">http://www.c-plusplus.net/forum/p2187510#2187510</a></p>
<p>Einzelne Ausdrücke werden mit der Uniform Initialisation tatsächlich eleganter, daher würde ich nicht pauschal von der <code>{}</code> -Syntax abraten. Aber man sollte sich im Klaren sein, dass von &quot;einheitlich&quot; nicht wirklich die Rede sein kann.</p>
<p>Man hätte meines Wissens viel mehr erreicht, wenn man <code>{}</code> nur für eigentliche Listen eingesetzt hätte. Dann wären keine Inkonsistenzen und Mehrdeutigkeiten aufgetreten. Aber momentan fühle ich mich lediglich an <a href="http://www.xkcd.com/927" rel="nofollow">www.xkcd.com/927</a> erinnert...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296313</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 05 Feb 2013 21:55:14 GMT</pubDate></item><item><title><![CDATA[Reply to Die &amp;quot;Uniform&amp;quot; Initialization besser vermeiden on Tue, 05 Feb 2013 22:59:21 GMT]]></title><description><![CDATA[<p>Gut, das scheint hier schon angekommen zu sein (hab ich gar noch nicht gesehen). Jetzt steht es halt mehrfach hier im Forum.</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>daher würde ich nicht pauschal von der <code>{}</code> -Syntax abraten.</p>
</blockquote>
<p>Eigentlich kann man sie nur dann gefahrlos einsetzen, wenn man den Konstruktor mit der initializer_list verwenden möchte.<br />
Andererseits kann man keinen Konstruktor schreiben, der eine initializer_list annimmt, weil dann Code, der {} einsetzt, das Verhalten ändert.<br />
Der einzige Ausweg scheint mir zu sein, auf initializer_list und {...} zu verzichten, ausser wenn ein Standardcontainer mit einer Liste initialisiert werden soll oder mit der neuen for-Loop.<br />
Nur der Default-Konstruktor &quot;{}&quot; ist in Ordnung.</p>
<p>Mit variadischen Templates hätte es aus meiner Sicht genügend bessere Alternativen gegeben, aber dann wäre C++ uneinheitlich und nicht mehr so anfängergerecht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296329</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296329</guid><dc:creator><![CDATA[templer]]></dc:creator><pubDate>Tue, 05 Feb 2013 22:59:21 GMT</pubDate></item><item><title><![CDATA[Reply to Die &amp;quot;Uniform&amp;quot; Initialization besser vermeiden on Tue, 05 Feb 2013 23:05:47 GMT]]></title><description><![CDATA[<p>templer schrieb:</p>
<blockquote>
<p>aber dann wäre C++ uneinheitlich und nicht mehr so anfängergerecht.</p>
</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="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> <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/2296331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296331</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 05 Feb 2013 23:05:47 GMT</pubDate></item><item><title><![CDATA[Reply to Die &amp;quot;Uniform&amp;quot; Initialization besser vermeiden on Tue, 05 Feb 2013 23:20:03 GMT]]></title><description><![CDATA[<p>+1</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296334</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296334</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Tue, 05 Feb 2013 23:20:03 GMT</pubDate></item><item><title><![CDATA[Reply to Die &amp;quot;Uniform&amp;quot; Initialization besser vermeiden on Wed, 06 Feb 2013 07:01:23 GMT]]></title><description><![CDATA[<p>abgesehen davon ist die Compilerunterstützung auch noch nicht komplett. laut C++11 Ref kann man eine braced-init-list auch zusammen mit op new verwenden, der MSVC mag diese Konstruktion aber nicht</p>
<pre><code>int * pi1 = new int { 3 };
  int * pi2 = new int [4] { 3, 4, 5, 6 };
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2296347</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296347</guid><dc:creator><![CDATA[dd++ 0]]></dc:creator><pubDate>Wed, 06 Feb 2013 07:01:23 GMT</pubDate></item><item><title><![CDATA[Reply to Die &amp;quot;Uniform&amp;quot; Initialization besser vermeiden on Wed, 06 Feb 2013 07:25:40 GMT]]></title><description><![CDATA[<p>dd++ schrieb:</p>
<blockquote>
<p>abgesehen davon ist die Compilerunterstützung auch noch nicht komplett. laut C++11 Ref kann man eine braced-init-list auch zusammen mit op new verwenden, der MSVC mag diese Konstruktion aber nicht</p>
<pre><code>int * pi1 = new int { 3 };
  int * pi2 = new int [4] { 3, 4, 5, 6 };
</code></pre>
</blockquote>
<p>najut, dass MSVC hinterhehingt, ist ja allgemein bekannt. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2296353</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296353</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Wed, 06 Feb 2013 07:25:40 GMT</pubDate></item><item><title><![CDATA[Reply to Die &amp;quot;Uniform&amp;quot; Initialization besser vermeiden on Wed, 06 Feb 2013 09:08:09 GMT]]></title><description><![CDATA[<blockquote>
<p>aber dann wäre C++ uneinheitlich und nicht mehr so anfängergerecht.</p>
</blockquote>
<p>C++ ist wohl die allerletzte Sprache die anfängergerecht ist. C++ Code mit einem einfachen Interface hingegen gilt meistens als &quot;schlecht&quot;. Hingegen ist Boost angeblich &quot;gut&quot;.</p>
<p>In anderen Sprachen bringt man nach 1 Woche nette Projekte auf die Beine. In C++ liegt man nach ner Woche höchstens wimmernd unter dem SChreibtisch, nachdem der Compiler bei einem kleinen Tippfehler in Templatecode mal wieder ein paar hundert Zeilen Fehlermeldungen rausgehauen hat.</p>
<p>Nicht falsch verstehen, ich mag C++ gerade weil es freakig ist, aber wenn man ein anfängergerechtes C++ will, sollte man sich doch lieber D oder so ansehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2296376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2296376</guid><dc:creator><![CDATA[Ethon]]></dc:creator><pubDate>Wed, 06 Feb 2013 09:08:09 GMT</pubDate></item></channel></rss>