<?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 verliert strings?]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>gerade bin ich über ein komisches Verhalten von <code>std::initializer_list</code> gestolpert. Den Code konnte ich auf dieses Schnipsel reduzieren:</p>
<pre><code>#include &lt;initializer_list&gt;
#include &lt;iostream&gt;

struct Egal
{
    Egal( const std::string&amp; txt, int i )
        : txt_( txt )
        , i_( i )
    {}
    template&lt; typename E, typename Traits &gt;
    friend std::basic_ostream&lt; E, Traits &gt;&amp; operator&lt;&lt;( std::basic_ostream&lt; E, Traits &gt;&amp; out, const Egal&amp; x )
    {
        return out &lt;&lt; x.txt_ &lt;&lt; &quot;;&quot; &lt;&lt; x.i_;
    }
private:
    std::string txt_;
    int i_;
};
int main()
{
    using namespace std;
    auto il = std::initializer_list&lt; Egal &gt;{ {&quot;erster&quot;, 12}, {&quot;zweiter&quot;, 13}, {&quot;dritter&quot;, 14} }; // Fehler - Texte sind leer!
    // std::initializer_list&lt; Egal &gt; il = { {&quot;erster&quot;, 12}, {&quot;zweiter&quot;, 13}, {&quot;dritter&quot;, 14} };   // Ok!
    for( auto&amp; e: il )
        cout &lt;&lt; e &lt;&lt; &quot; &quot;;
    cout &lt;&lt; endl;
}
</code></pre>
<p>Der Output ist - Oh Schreck:</p>
<blockquote>
<p>;12 ;13 ;14</p>
</blockquote>
<p>statt des erwarteten Outputs von</p>
<pre><code>erster;12 zweiter;13 dritter;14
</code></pre>
<p>, der sich einstellen würde, wenn man Zeile 22 durch Zeile 23 ersetzt.</p>
<p>Im Debugger kann ich sehen, dass ein Objekt der Klasse <code>std::initializer_list&lt; Egal &gt;</code> angelegt wird, mit zwei Pointern, die auf Objekte der Klasse Egal zeigen, in denen die Texte noch vorhanden sind. Diese ( <code>Egal</code> -)Objekte sind aber NICHT identisch zu den Objekten, auf die die Zeiger von <code>il</code> gerichtet sind!? ... Das funktioniert auch, wenn ich Kopier- und Zuweisungs-Konstruktor von <code>Egal</code> still lege!</p>
<p>Was ist da passiert? Bin ich in irgendeinen Fallstrick getreten oder macht mein Compiler was falsch? Ich verwende Visual Studio 2013 Update 4.<br />
Lasse ich den Code bei <a href="http://ideone.com" rel="nofollow">http://ideone.com</a> laufen - passiert dieser Fehler nicht.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/340323/std-initializer_list-verliert-strings</link><generator>RSS for Node</generator><lastBuildDate>Sat, 11 Apr 2026 07:11:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/340323.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 31 Oct 2016 14:52:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::initializer_list verliert strings? on Mon, 31 Oct 2016 14:58:32 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>gerade bin ich über ein komisches Verhalten von <code>std::initializer_list</code> gestolpert. Den Code konnte ich auf dieses Schnipsel reduzieren:</p>
<pre><code>#include &lt;initializer_list&gt;
#include &lt;iostream&gt;

struct Egal
{
    Egal( const std::string&amp; txt, int i )
        : txt_( txt )
        , i_( i )
    {}
    template&lt; typename E, typename Traits &gt;
    friend std::basic_ostream&lt; E, Traits &gt;&amp; operator&lt;&lt;( std::basic_ostream&lt; E, Traits &gt;&amp; out, const Egal&amp; x )
    {
        return out &lt;&lt; x.txt_ &lt;&lt; &quot;;&quot; &lt;&lt; x.i_;
    }
private:
    std::string txt_;
    int i_;
};
int main()
{
    using namespace std;
    auto il = std::initializer_list&lt; Egal &gt;{ {&quot;erster&quot;, 12}, {&quot;zweiter&quot;, 13}, {&quot;dritter&quot;, 14} }; // Fehler - Texte sind leer!
    // std::initializer_list&lt; Egal &gt; il = { {&quot;erster&quot;, 12}, {&quot;zweiter&quot;, 13}, {&quot;dritter&quot;, 14} };   // Ok!
    for( auto&amp; e: il )
        cout &lt;&lt; e &lt;&lt; &quot; &quot;;
    cout &lt;&lt; endl;
}
</code></pre>
<p>Der Output ist - Oh Schreck:</p>
<blockquote>
<p>;12 ;13 ;14</p>
</blockquote>
<p>statt des erwarteten Outputs von</p>
<pre><code>erster;12 zweiter;13 dritter;14
</code></pre>
<p>, der sich einstellen würde, wenn man Zeile 22 durch Zeile 23 ersetzt.</p>
<p>Im Debugger kann ich sehen, dass ein Objekt der Klasse <code>std::initializer_list&lt; Egal &gt;</code> angelegt wird, mit zwei Pointern, die auf Objekte der Klasse Egal zeigen, in denen die Texte noch vorhanden sind. Diese ( <code>Egal</code> -)Objekte sind aber NICHT identisch zu den Objekten, auf die die Zeiger von <code>il</code> gerichtet sind!? ... Das funktioniert auch, wenn ich Kopier- und Zuweisungs-Konstruktor von <code>Egal</code> still lege!</p>
<p>Was ist da passiert? Bin ich in irgendeinen Fallstrick getreten oder macht mein Compiler was falsch? Ich verwende Visual Studio 2013 Update 4.<br />
Lasse ich den Code bei <a href="http://ideone.com" rel="nofollow">http://ideone.com</a> laufen - passiert dieser Fehler nicht.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2513622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2513622</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 31 Oct 2016 14:58:32 GMT</pubDate></item><item><title><![CDATA[Reply to std::initializer_list verliert strings? on Mon, 31 Oct 2016 15:01:08 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich verwende Visual Studio 2013 Update 4.</p>
</blockquote>
<p>Problem gelöst: VC++ ist unergründlich beschissen (Rextesters Version <a href="http://rextester.com/TBGH47356" rel="nofollow">unterliegt sogar einem ICE</a>). Im Übrigen glaube ich nicht, dass das eine <em>minimale</em> Reproduktion des Fehlers ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2513624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2513624</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Mon, 31 Oct 2016 15:01:08 GMT</pubDate></item></channel></rss>