std::initializer_list verliert strings?



  • Hallo Leute,

    gerade bin ich über ein komisches Verhalten von std::initializer_list gestolpert. Den Code konnte ich auf dieses Schnipsel reduzieren:

    #include <initializer_list>
    #include <iostream>
    
    struct Egal
    {
        Egal( const std::string& txt, int i )
            : txt_( txt )
            , i_( i )
        {}
        template< typename E, typename Traits >
        friend std::basic_ostream< E, Traits >& operator<<( std::basic_ostream< E, Traits >& out, const Egal& x )
        {
            return out << x.txt_ << ";" << x.i_;
        }
    private:
        std::string txt_;
        int i_;
    };
    int main()
    {
        using namespace std;
        auto il = std::initializer_list< Egal >{ {"erster", 12}, {"zweiter", 13}, {"dritter", 14} }; // Fehler - Texte sind leer!
        // std::initializer_list< Egal > il = { {"erster", 12}, {"zweiter", 13}, {"dritter", 14} };   // Ok!
        for( auto& e: il )
            cout << e << " ";
        cout << endl;
    }
    

    Der Output ist - Oh Schreck:

    ;12 ;13 ;14

    statt des erwarteten Outputs von

    erster;12 zweiter;13 dritter;14
    

    , der sich einstellen würde, wenn man Zeile 22 durch Zeile 23 ersetzt.

    Im Debugger kann ich sehen, dass ein Objekt der Klasse std::initializer_list< Egal > angelegt wird, mit zwei Pointern, die auf Objekte der Klasse Egal zeigen, in denen die Texte noch vorhanden sind. Diese ( Egal -)Objekte sind aber NICHT identisch zu den Objekten, auf die die Zeiger von il gerichtet sind!? ... Das funktioniert auch, wenn ich Kopier- und Zuweisungs-Konstruktor von Egal still lege!

    Was ist da passiert? Bin ich in irgendeinen Fallstrick getreten oder macht mein Compiler was falsch? Ich verwende Visual Studio 2013 Update 4.
    Lasse ich den Code bei http://ideone.com laufen - passiert dieser Fehler nicht.

    Gruß
    Werner


  • Mod

    Ich verwende Visual Studio 2013 Update 4.

    Problem gelöst: VC++ ist unergründlich beschissen (Rextesters Version unterliegt sogar einem ICE). Im Übrigen glaube ich nicht, dass das eine minimale Reproduktion des Fehlers ist.


Anmelden zum Antworten