<?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[auto placeholder für Variablendefinitionen - initializer lists]]></title><description><![CDATA[<p>Viele regen sich seit jeher darüber auf, dass bei <code>auto</code> als placeholder bei einer Variablendefinition initializer lists automatisch als <code>initializer_list</code> deduziert werden:</p>
<pre><code>auto i = {1, 2, 3}; // Der Typ von i ist std::initializer_list&lt;int&gt;
</code></pre>
<p>Zum einen weil es inkonsequent zur Deduzierung von Template-Argumenten ist - eine initializer list als Funktionsargument ist ein non-deduced context, demenstprechend wird kein Template-Argument für ein Funktionsargument wie <code>{1, 2}</code> deduziert.</p>
<p>Das hat jedoch einen guten Grund: Wenn zwei Funktionsparameter mit demselben Template-Parameter im Typ deklariert werden, kann ein Funktionsargument eine initializer list sein, weil das Template-Argument ausschließlich vom jeweils anderen Argument deduziert werden darf. Das verkürzt die Schreibweise deutlich:</p>
<pre><code>copy( istream_iterator&lt;int&gt;{cin}, {}, back_inserter(my_vec) );
// Statt
copy( istream_iterator&lt;int&gt;{cin}, istream_iterator&lt;int&gt;{}, back_inserter(my_vec) );
</code></pre>
<p>(Wären initializer lists also kein non-deduced context, und es gäbe dieselbe Regelung wie bei <code>auto</code> , dann würde es bei der ersten Variante einfach einen Fehler geben, da man keinen Elementtyp für die <code>initializer_list</code> von der leeren Liste deduzieren könnte)<br />
Daher ist das für mich nicht wirklich überzeugend.</p>
<p>Zum anderen regt man sich darüber auf weil man keinen Grund für diese Regelung finden kann und sich folglich fragt, was wohl die Überlegung hinter diesem Feature gewesen sein mag. Schließlich scheint es reichlich überflüssig und nur ein weiterer Stolperstein zu sein.</p>
<p>Ich glaube den Grund gefunden zu haben: range-based for. Genau genommen folgendes Idiom:</p>
<pre><code>for( auto i : {...} )
    // Tu verschiedenes für verschiedene Werte von i
</code></pre>
<p>Finde ich extrem sexy und habe es erst gerade wieder verwendet. Es funktioniert, weil eine Referenz auf die Range deklariert wird, und unsere Spezialregel greift:</p>
<p>§6.5.4/1 schrieb:</p>
<blockquote>
<pre><code>auto &amp;&amp; __range = range-init;
</code></pre>
</blockquote>
<p>Für <code>new auto</code> wurde die Regel übrigens nicht eingeführt - dort ist eine initializer list als initializer nicht erlaubt.</p>
<p>Aber das muss Meyers ja schon gekannt haben, als er neulich im C++-Talk darauf hinwies, dass er denjenigen der für die Aufnahme dieser Regel verantwortlich ist gerne mal fragen würde, wofür diese Regelung existiert.</p>
<p>Also: Warum ist dieses Idiom kein Argument für diese Spezialregelung? Weil man einfach hätte sagen können &quot;Hey, für range-base for sind initializer lists erlaubt&quot;?<br />
Das schmeckt zumindest mir nicht so, weil man auch an anderen Stellen wo bspw. ein Makro eine Range erwartet, so etwas ausnutzen könnte. Also ein Grund könnte es sicherlich gewesen sein.<br />
Oder nicht? Und wo könnte man das noch anwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326335/auto-placeholder-für-variablendefinitionen-initializer-lists</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Jul 2026 03:05:11 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326335.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 12 Jun 2014 20:27:31 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to auto placeholder für Variablendefinitionen - initializer lists on Thu, 12 Jun 2014 20:37:58 GMT]]></title><description><![CDATA[<p>Viele regen sich seit jeher darüber auf, dass bei <code>auto</code> als placeholder bei einer Variablendefinition initializer lists automatisch als <code>initializer_list</code> deduziert werden:</p>
<pre><code>auto i = {1, 2, 3}; // Der Typ von i ist std::initializer_list&lt;int&gt;
</code></pre>
<p>Zum einen weil es inkonsequent zur Deduzierung von Template-Argumenten ist - eine initializer list als Funktionsargument ist ein non-deduced context, demenstprechend wird kein Template-Argument für ein Funktionsargument wie <code>{1, 2}</code> deduziert.</p>
<p>Das hat jedoch einen guten Grund: Wenn zwei Funktionsparameter mit demselben Template-Parameter im Typ deklariert werden, kann ein Funktionsargument eine initializer list sein, weil das Template-Argument ausschließlich vom jeweils anderen Argument deduziert werden darf. Das verkürzt die Schreibweise deutlich:</p>
<pre><code>copy( istream_iterator&lt;int&gt;{cin}, {}, back_inserter(my_vec) );
// Statt
copy( istream_iterator&lt;int&gt;{cin}, istream_iterator&lt;int&gt;{}, back_inserter(my_vec) );
</code></pre>
<p>(Wären initializer lists also kein non-deduced context, und es gäbe dieselbe Regelung wie bei <code>auto</code> , dann würde es bei der ersten Variante einfach einen Fehler geben, da man keinen Elementtyp für die <code>initializer_list</code> von der leeren Liste deduzieren könnte)<br />
Daher ist das für mich nicht wirklich überzeugend.</p>
<p>Zum anderen regt man sich darüber auf weil man keinen Grund für diese Regelung finden kann und sich folglich fragt, was wohl die Überlegung hinter diesem Feature gewesen sein mag. Schließlich scheint es reichlich überflüssig und nur ein weiterer Stolperstein zu sein.</p>
<p>Ich glaube den Grund gefunden zu haben: range-based for. Genau genommen folgendes Idiom:</p>
<pre><code>for( auto i : {...} )
    // Tu verschiedenes für verschiedene Werte von i
</code></pre>
<p>Finde ich extrem sexy und habe es erst gerade wieder verwendet. Es funktioniert, weil eine Referenz auf die Range deklariert wird, und unsere Spezialregel greift:</p>
<p>§6.5.4/1 schrieb:</p>
<blockquote>
<pre><code>auto &amp;&amp; __range = range-init;
</code></pre>
</blockquote>
<p>Für <code>new auto</code> wurde die Regel übrigens nicht eingeführt - dort ist eine initializer list als initializer nicht erlaubt.</p>
<p>Aber das muss Meyers ja schon gekannt haben, als er neulich im C++-Talk darauf hinwies, dass er denjenigen der für die Aufnahme dieser Regel verantwortlich ist gerne mal fragen würde, wofür diese Regelung existiert.</p>
<p>Also: Warum ist dieses Idiom kein Argument für diese Spezialregelung? Weil man einfach hätte sagen können &quot;Hey, für range-base for sind initializer lists erlaubt&quot;?<br />
Das schmeckt zumindest mir nicht so, weil man auch an anderen Stellen wo bspw. ein Makro eine Range erwartet, so etwas ausnutzen könnte. Also ein Grund könnte es sicherlich gewesen sein.<br />
Oder nicht? Und wo könnte man das noch anwenden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403680</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Thu, 12 Jun 2014 20:37:58 GMT</pubDate></item><item><title><![CDATA[Reply to auto placeholder für Variablendefinitionen - initializer lists on Fri, 13 Jun 2014 11:16:59 GMT]]></title><description><![CDATA[<p>Nach meiner Ansicht sind initializer_lists ohnehin voellig falsch erdacht.<br />
Sie sind zwar ein nettes syntaktisches Feature, aber da die Objekte nicht aenderbar sind, kann man ja auch nicht moven.<br />
Ich haette { ... } automatisch den Typ std::array gegeben, dann haette man sie wenn noetig falls selber als const-reference uebergeben und andernfalls halt auch moven koennen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403737</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403737</guid><dc:creator><![CDATA[Marthog]]></dc:creator><pubDate>Fri, 13 Jun 2014 11:16:59 GMT</pubDate></item><item><title><![CDATA[Reply to auto placeholder für Variablendefinitionen - initializer lists on Fri, 13 Jun 2014 11:32:04 GMT]]></title><description><![CDATA[<p>@Arcoth: Was würde <code>auto</code> als Typ deduzieren, wenn nicht <code>std::initializer_list&lt;T&gt;</code> ? Oder ist die Frage, warum es nicht immer zu Compilerfehlern wie bei Funktionstemplates führt? Falls ja, hast du die Frage doch schon beantwortet, oder? Bei <code>auto</code> führt das Erlauben zu keinen Konflikten und erlaubt gleichzeitig einige sinnvolle Anwendungsfälle.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23821">@Marthog</a>: Das Problem ist, dass es bisher bereits die {}-Syntax gab (Aggregat-/Array-Initialisierung), und man <code>std::initializer_list</code> nachträglich irgendwie einbauen musste. Zudem musste man es mit der &quot;uniform&quot; initialization sinnvoll kombinieren, welche an sich schon sehr fragwürdig ist... Wäre interessant zu schauen, wie sowas von Beginn an umgesetzt würde. Kennt jemand eine statisch typisierte Sprache, die ein ähnliches Konzept etwas anders umsetzt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403739</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 13 Jun 2014 11:32:04 GMT</pubDate></item><item><title><![CDATA[Reply to auto placeholder für Variablendefinitionen - initializer lists on Fri, 13 Jun 2014 16:19:31 GMT]]></title><description><![CDATA[<p>Marthog schrieb:</p>
<blockquote>
<p>Sie sind zwar ein nettes syntaktisches Feature, aber da die Objekte nicht aenderbar sind, kann man ja auch nicht moven.</p>
</blockquote>
<p>Ja, aber die <code>initializer_list</code> speichert die Elemente nicht selbst, daher kannst du sie kostenlos hin und her kopieren. <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>Nexus schrieb:</p>
<blockquote>
<p>@Arcoth: Was würde <code>auto</code> als Typ deduzieren, wenn nicht <code>std::initializer_list&lt;T&gt;</code> ?</p>
</blockquote>
<p>Nein, dass der einzig sinnvolle Typ <code>std::initializer_list</code> ist, ist klar. Etwas anderes wie das von Marthog vorgeschlagene ( <code>std::array</code> ) ist mMn. nicht sinnvoll.</p>
<blockquote>
<p>Oder ist die Frage, warum es nicht immer zu Compilerfehlern wie bei Funktionstemplates führt?</p>
</blockquote>
<p>Exakt. Viele (auch in SO Chats) haben diskutiert, wozu die Regel überhaupt eingeführt wurde, und ich habe stets im Hinterkopf behalten, nach Gründen zu suchen.</p>
<blockquote>
<p>Falls ja, hast du die Frage doch schon beantwortet, oder? Bei <code>auto</code> führt das Erlauben zu keinen Konflikten und erlaubt gleichzeitig einige sinnvolle Anwendungsfälle.</p>
</blockquote>
<p>Ja, aber warum sieht <em>Meyers</em> das anders? Der ist doch nicht dumm und wird sicher darüber nachgedacht haben?<br />
In seinem Bash-Talk sagt er an <a href="http://youtu.be/48kP_Ssg2eY?t=25m30s" rel="nofollow">dieser Stelle</a> explizit, dass er diese Entscheidung nicht nachvollziehen kann. Das hat mich tatsächlich geärgert, weil hier offensichtlich ein Mainstream-C++-Experte einfach nicht genug auf so ein Thema eingegangen ist, bzw. mögliche Gründe nicht einmal nebenbei angesprochen hat, obwohl er offenbar jahrelang erfolglos versucht hat, den Grund für diese Spezialregelung (u.a. vom Komitee) zu erhalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2403776</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403776</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Fri, 13 Jun 2014 16:19:31 GMT</pubDate></item><item><title><![CDATA[Reply to auto placeholder für Variablendefinitionen - initializer lists on Fri, 13 Jun 2014 16:50:22 GMT]]></title><description><![CDATA[<p>Meyers ist auch nur ein Mensch. Vielleicht hat er was übersehen (in seinem Effective C++ waren ja einzelne Ratschläge auch nachträglich revidiert worden) oder hält die Gründe einfach nicht für wichtig. Du hast ja gezeigt, dass es solche gibt.</p>
<p>Bei diesem Talk ging es sowieso mehr darum, Inkonsistenzen aufzuzeigen, statt diese im Detail nachzuvollziehen (was dem Publikum wahrscheinlich entgegenkam). Ich könnte mir vorstellen, dass das &quot;I have tried for years&quot; durchaus überspitzt ist, und er C++ hier schlechter darstellen will als es ist, bzw. keine Lust hat, die Einzelheiten in aller Länge durchzukauen.</p>
<p>Frag ihn doch, warum er eigentlich Jahre braucht um nichts herauszufinden, während du die Antwort innert kürzester Zeit kanntest <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/2403779</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403779</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 13 Jun 2014 16:50:22 GMT</pubDate></item><item><title><![CDATA[Reply to auto placeholder für Variablendefinitionen - initializer lists on Sat, 14 Jun 2014 18:20:26 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Frag ihn doch, warum er eigentlich Jahre braucht um nichts herauszufinden, während du die Antwort innert kürzester Zeit kanntest <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>Das stimmt so nicht. Sicherlich ist meine Begründung einfach nicht überzeugend, bzw. falsch. Aber habe ihn trotzdem mal kontaktiert.</p>
<p>Habe auch die Begründung darauf erweitert, dass man i.A. Initializer für Verweise auf Ranges/Kopien von Ranges nicht für initializer lists &quot;spezialisieren&quot; will. Wenn ich ein syntaktisches Konstrukt habe das eine Range darstellt, dann will ich - egal ob es eine braced-init-list oder ein lvalue das auf einen <code>vector</code> verweist ist - folgendes schreiben können, vielleicht in einem weiteren Standard oder in einem Makro:</p>
<pre><code>auto&amp;&amp; ref = ...;
auto copy = ...;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2403798</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2403798</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Sat, 14 Jun 2014 18:20:26 GMT</pubDate></item></channel></rss>