<?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[std::initializer_list rant]]></title><description><![CDATA[<p>Nachdem ich mich nun intensiv mit den neuen C++11/14 Sprachmitteln und dergleichen auseinandergesetzt habe muss ich sagen, dass std::initializer_list der wahrscheinlich größte Blödsinn ist, der es in den Standard geschafft hat. Inwiefern ergibt das Folgende Sinn?</p>
<pre><code>int a{5};
std::vector&lt;int&gt; b{5, 5}; // ups, .size() == 2
unbekannte_klasse_aus_3rd_party_library c{5}; // Darf ich hier list initialization verwenden oder nicht? Kann ich ohne die Doku nicht wissen...
auto d{5}; // ups, d ist KEIN int!
auto e{a}; // ups, e ist IMMER NOCH KEIN int!
</code></pre>
<p>Anstatt dass man nun überall list initialization verwenden kann, um die Kontext-Sensibilität von () zu umgehen, muss man nun <strong>je nach Fall</strong> entscheiden, welche Art der Initialisierung korrekt (nicht nur geeignet / ungeeignet, nein, sondern gar korrekt oder inkorrekt!) ist. Die durch list initialization versprochene Vereinfachung hat - in Kombination mit std::initializer_list - alles um ein Vielfaches komplizierter gemacht.</p>
<p>Zudem sei gesagt, dass ein Feature wie std::initializer_list <strong>niemals</strong> nötig war. Man kann gleiches Verhalten (mit leicht anderer Syntax) auch ansonsten implementieren mit Proxies, die den Komma-Operator überladen oder einfach mit variadic templates.</p>
<p>Kann mich jemand davon überzeugen, dass std::initializer_list nicht einfach nur ein katastrophaler Designfehler war? Hat C++1z vor, da irgendwie Abhilfe zu leisten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/339782/std-initializer_list-rant</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 19:58:15 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/339782.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 28 Sep 2016 09:03:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::initializer_list rant on Wed, 28 Sep 2016 14:03:36 GMT]]></title><description><![CDATA[<p>Nachdem ich mich nun intensiv mit den neuen C++11/14 Sprachmitteln und dergleichen auseinandergesetzt habe muss ich sagen, dass std::initializer_list der wahrscheinlich größte Blödsinn ist, der es in den Standard geschafft hat. Inwiefern ergibt das Folgende Sinn?</p>
<pre><code>int a{5};
std::vector&lt;int&gt; b{5, 5}; // ups, .size() == 2
unbekannte_klasse_aus_3rd_party_library c{5}; // Darf ich hier list initialization verwenden oder nicht? Kann ich ohne die Doku nicht wissen...
auto d{5}; // ups, d ist KEIN int!
auto e{a}; // ups, e ist IMMER NOCH KEIN int!
</code></pre>
<p>Anstatt dass man nun überall list initialization verwenden kann, um die Kontext-Sensibilität von () zu umgehen, muss man nun <strong>je nach Fall</strong> entscheiden, welche Art der Initialisierung korrekt (nicht nur geeignet / ungeeignet, nein, sondern gar korrekt oder inkorrekt!) ist. Die durch list initialization versprochene Vereinfachung hat - in Kombination mit std::initializer_list - alles um ein Vielfaches komplizierter gemacht.</p>
<p>Zudem sei gesagt, dass ein Feature wie std::initializer_list <strong>niemals</strong> nötig war. Man kann gleiches Verhalten (mit leicht anderer Syntax) auch ansonsten implementieren mit Proxies, die den Komma-Operator überladen oder einfach mit variadic templates.</p>
<p>Kann mich jemand davon überzeugen, dass std::initializer_list nicht einfach nur ein katastrophaler Designfehler war? Hat C++1z vor, da irgendwie Abhilfe zu leisten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509945</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509945</guid><dc:creator><![CDATA[neckbeard420]]></dc:creator><pubDate>Wed, 28 Sep 2016 14:03:36 GMT</pubDate></item><item><title><![CDATA[Reply to std::initializer_list rant on Wed, 28 Sep 2016 09:04:40 GMT]]></title><description><![CDATA[<p>Kann ein Mod bitte das Code-Tag fixen? Habe mich vertan...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509946</guid><dc:creator><![CDATA[neckbeard420]]></dc:creator><pubDate>Wed, 28 Sep 2016 09:04:40 GMT</pubDate></item><item><title><![CDATA[Reply to std::initializer_list rant on Wed, 28 Sep 2016 10:22:47 GMT]]></title><description><![CDATA[<p>neckbeard420 schrieb:</p>
<blockquote>
<pre><code>std::vector&lt;int&gt; b{5, 5}; // ups, .size() == 2
</code></pre>
</blockquote>
<p>Das ist in der Tat etwas ungünstig, aber irgendwie muss man diese Mehrdeutigkeit schliesslich auflösen. In solchen Ausnahmefällen ein <code>b(5, 5)</code> finde ich nicht übermässig schlimm.</p>
<p>neckbeard420 schrieb:</p>
<blockquote>
<pre><code>unbekannte_klasse_aus_3rd_party_library c{5}; // Darf ich hier list initialization verwenden oder nicht? Kann ich ohne die Doku nicht wissen...
</code></pre>
</blockquote>
<p>Wenn du so wenig Dokumentation hast, dann frage ich mich ob du überhaupt in der lage bist, die Klasse zu initalisieren, wenn sie nicht zufällig einen Default Constructor hat. Wer herausfinden kann, dass eine Klasse einen Konstruktor mit einem <code>int</code> -Argument hat, der kann auch herausfinden, dass sie einen vom Typ <code>initializer_list&lt;int&gt;</code> hat.</p>
<p>neckbeard420 schrieb:</p>
<blockquote>
<pre><code>auto d{5}; // ups, d ist KEIN int!
auto e{a}; // ups, e ist IMMER NOCH KEIN int!
</code></pre>
</blockquote>
<p>Wenn man einen <code>int</code> möchte, dann sollte man <code>auto</code> auch mit einem solchen füttern und nicht mit <code>initializer_list&lt;int&gt;</code> <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>neckbeard420 schrieb:</p>
<blockquote>
<p>Man kann gleiches Verhalten (mit leicht anderer Syntax) auch ansonsten implementieren mit Proxies, die den Komma-Operator überladen oder einfach mit variadic templates.</p>
</blockquote>
<p>Wenn DAS die Alternativen sind, dann nehme ich diese kleine Unnanehmlichkeit der <code>initializer_list</code> allein schon wegen der Code-Lesbarkeit/Verständlichkeit gerne in kauf <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>neckbeard420 schrieb:</p>
<blockquote>
<p>Kann mich jemand davon überzeugen, dass std::initializer_list nicht einfach nur ein katastrophaler Designfehler war? Hat C++1z vor, da irgendwie Abhilfe zu leisten?</p>
</blockquote>
<p>Zumindest erstmal ein Argument: So was hier finde ich schon sehr elegant, ich kann mir kaum vorstellen dass man das mit älteren Sprachmitteln so schön hinbekommt:</p>
<pre><code>std::map&lt;std::string, std::vector&lt;int&gt;&gt; m = 
{
	{ &quot;eins&quot;, { 1 } },
	{ &quot;zwei&quot;, { 1, 2 } },
	{ &quot;drei&quot;, { 1, 2, 3 } }
};
</code></pre>
<p>Für meinen Geschmack hat dein &quot;Rant&quot; etwas zu wenig Fleisch, auch wenn 1,24 deiner Argumente durchaus valide sind.<br />
Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509961</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509961</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Wed, 28 Sep 2016 10:22:47 GMT</pubDate></item><item><title><![CDATA[Reply to std::initializer_list rant on Wed, 28 Sep 2016 11:07:53 GMT]]></title><description><![CDATA[<p>Finnegan schrieb:</p>
<blockquote>
<p>neckbeard420 schrieb:</p>
<blockquote>
<p>Man kann gleiches Verhalten (mit leicht anderer Syntax) auch ansonsten implementieren mit Proxies, die den Komma-Operator überladen oder einfach mit variadic templates.</p>
</blockquote>
<p>Wenn DAS die Alternativen sind, dann nehme ich diese kleine Unnanehmlichkeit der <code>initializer_list</code> allein schon wegen der Code-Lesbarkeit/Verständlichkeit gerne in kauf <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>Welche Code-Lesbarkeit/Verständlichkeit soll das sein? Kommaüberladung ist böse; Variadic-Templates allerdings sind wesentlich mächtiger als initialize_list - und erfordern nicht, dass an der Initialisierungs-Semantik herumgepfuscht werden muss. Im Wesentlichen sehe ich zwei wichtige Kritikpunkte:<br />
1. Variadic Templatekonstruktoren und initializer_list-Konstruktoren können nicht koexistieren. Das schränkt schon mal die Wiederverwendbarkeit ein. Und weil bestehender Code nicht kaputtgemacht werden soll, sehe ich nicht, dass diese Problematik in kommenden Standards beseitigt wird.<br />
2. initializer_list unterstützt keine Movesemantik.</p>
<p>neckbeard420 schrieb:</p>
<blockquote>
<pre><code>int a{5};
auto d{5}; // ups, d ist KEIN int!
auto e{a}; // ups, e ist IMMER NOCH KEIN int!
</code></pre>
</blockquote>
<p>Habe sowieso noch nie verstanden, wieso niemand mehr = verwenden will. Mit Lesbarkeit hat es jedenfalls nichts zu tun...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509966</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509966</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 28 Sep 2016 11:07:53 GMT</pubDate></item><item><title><![CDATA[Reply to std::initializer_list rant on Wed, 28 Sep 2016 11:14:12 GMT]]></title><description><![CDATA[<p>Finnegan schrieb:</p>
<blockquote>
<p>Das ist in der Tat etwas ungünstig, aber irgendwie muss man diese Mehrdeutigkeit schliesslich auflösen. In solchen Ausnahmefällen ein <code>b(5, 5)</code> finde ich nicht übermässig schlimm.</p>
</blockquote>
<p>Siehe:</p>
<p>neckbeard420 schrieb:</p>
<blockquote>
<p>Anstatt dass man nun überall list initialization verwenden kann, um die Kontext-Sensibilität von () zu umgehen, muss man nun je nach Fall entscheiden, welche Art der Initialisierung korrekt (nicht nur geeignet / ungeeignet, nein, sondern gar korrekt oder inkorrekt!) ist. Die durch list initialization versprochene Vereinfachung hat - in Kombination mit std::initializer_list - alles um ein Vielfaches komplizierter gemacht.</p>
</blockquote>
<p>Ein Konzept, das eine bestimmte Sache (Konstuktion von Objekten) vereinfachen sollte, hat es nur noch komplizierter gemacht.</p>
<p>Finnegan schrieb:</p>
<blockquote>
<p>Wenn du so wenig Dokumentation hast, dann frage ich mich ob du überhaupt in der lage bist, die Klasse zu initalisieren, wenn sie nicht zufällig einen Default Constructor hat. Wer herausfinden kann, dass eine Klasse einen Konstruktor mit einem <code>int</code> -Argument hat, der kann auch herausfinden, dass sie einen vom Typ <code>initializer_list&lt;int&gt;</code> hat.</p>
</blockquote>
<p>Wenn ich weiß, dass der Konstruktor einer Klasse z.B. zwei ints annimmt, so wie bei <code>std::vector&lt;int&gt;</code> , dann kann ich daraus dennoch nicht schlie­ßen, ob ich <code>T{0,0}</code> schreiben kann oder ob nur <code>T(0,0)</code> das korrekte Verhalten produziert. Um das feststellen zu können, muss ich ALLE Konstruktoren der besagten Klasse kennen.</p>
<p>neckbeard420 schrieb:</p>
<blockquote>
<p>Wenn man einen <code>int</code> möchte, dann sollte man <code>auto</code> auch mit einem solchen füttern und nicht mit <code>initializer_list&lt;int&gt;</code> <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>
</blockquote>
<p>Finde ich gut von dir, dass du eingestehst, dass du überhaupt keine Ahnung von dem Thema hast. Im Snippet haben weder <code>{5}</code> noch <code>{a}</code> den Typ <code>std::initializer_list&lt;int&gt;</code> . Der Sinnlosigkeit des gezeigten Snippets bin ich mir durchaus bewusst, da es auch eher exemplarisch gemeint war. Anders sieht es hingegen aus, wenn man einen wesentlich verboseren Typ zur Hand nimmt und eine Kopie eines Objekts dessen erstellen will:</p>
<pre><code>std::map&lt;std::string, std::vector&lt;int&gt;&gt; m;
auto b(m); // ok
auto b{m}; // ups...
</code></pre>
<p>Finnegan schrieb:</p>
<blockquote>
<p>Zumindest erstmal ein Argument: So was hier finde ich schon sehr elegant, ich kann mir kaum vorstellen dass man das mit älteren Sprachmitteln so schön hinbekommt:</p>
<pre><code>std::map&lt;std::string, std::vector&lt;int&gt;&gt; m = 
{
	{ &quot;eins&quot;, { 1 } },
	{ &quot;zwei&quot;, { 1, 2 } },
	{ &quot;drei&quot;, { 1, 2, 3 } }
};
</code></pre>
</blockquote>
<p>Schön? Ja. Nützlich? Wohl eher nicht. Wie oft kommen hardgecodete Container vor? Recht selten (z.B. LUTs, die profitieren aber nicht von <code>std::initializer_list</code> ). Und wie oft kommen hardgecodete Non-Contiguous-Container vor? Nie. Selbst in deinem (unsinnigen) Beispiel würde man die Vektoren generieren statt sie auszuschreiben. Außerdem weiß ich nicht, was es an den von mir genannten Alternativen auszusetzen gibt. Ist das hier etwa unleserlich?</p>
<pre><code>Eigen::Matrix3f m;
m &lt;&lt; 1, 2, 3,
     4, 5, 6,
     7, 8, 9;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2509967</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509967</guid><dc:creator><![CDATA[neckbeard420]]></dc:creator><pubDate>Wed, 28 Sep 2016 11:14:12 GMT</pubDate></item><item><title><![CDATA[Reply to std::initializer_list rant on Wed, 28 Sep 2016 11:25:12 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>neckbeard420 schrieb:</p>
<blockquote>
<pre><code>int a{5};
auto d{5}; // ups, d ist KEIN int!
auto e{a}; // ups, e ist IMMER NOCH KEIN int!
</code></pre>
</blockquote>
<p>Habe sowieso noch nie verstanden, wieso niemand mehr = verwenden will. Mit Lesbarkeit hat es jedenfalls nichts zu tun...</p>
</blockquote>
<p>So wie ich das verstanden habe, wollte man mit der list-initialization von C++11 die Initialisierung von Objekten vereinheitlichen, was ich eine gute Idee finde (korrigier mich, wenn das nicht stimmt). Bleibt da bloß, dass man dank <code>std::initializer_list</code> teilweise immer noch auf die beiden anderen Alternativen zurückfallen muss. Ohne sie könnte man überall und für alles list-initialization einsetzen. Relevant: <a href="https://xkcd.com/927/" rel="nofollow">https://xkcd.com/927/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2509968</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2509968</guid><dc:creator><![CDATA[neckbeard420]]></dc:creator><pubDate>Wed, 28 Sep 2016 11:25:12 GMT</pubDate></item></channel></rss>