std::initializer_list verliert strings?
-
Hallo Leute,
gerade bin ich über ein komisches Verhalten von
std::initializer_listgestolpert. 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 vonilgerichtet sind!? ... Das funktioniert auch, wenn ich Kopier- und Zuweisungs-Konstruktor vonEgalstill 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
-
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.