initializer_list selber schreiben?



  • Ich frag mich grade, wie die initializer_list funktioniert. Zum Beispiel steht hier, dass die Variable il hier vom Typ initializer_list ist:

    auto il = { 10, 20, 30 };  // the type of il is an initializer_list
    

    Ist die Information, dass Initialisierungslisten dem Typ initializer_list entsprechen, im Compiler fest kodiert? Wenn ja, wieso gibt es dann extra ne Header-Datei dafür und man hat es net in den "Kern" des Compilers mit rein programmiert?



  • http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01243_source.html
    der kommentar am privaten konstruktor sollte selbst erklärend sein.



  • Das beantwortet aber nicht meine Frage, wieso es gelöst ist wie es gelöst ist 🙂



  • initialisierer schrieb:

    Ist die Information, dass Initialisierungslisten dem Typ initializer_list entsprechen, im Compiler fest kodiert?

    Initialisierungslisten sind keine Ausdrücke, haben also auch keinen Typ. Ja, da ist Compilermagie am Werke.

    initialisierer schrieb:

    Wenn ja, wieso gibt es dann extra ne Header-Datei dafür und man hat es net in den "Kern" des Compilers mit rein programmiert?

    Wie das genau implementiert ist, wird den Herstellern überlassen. Ich glaube, ohne dass du den Header einbindest, ist nicht garantiert, dass das überhaupt so klappt. Aber da kann ich mich jetzt auch irren.



  • Wie sieht denn diese Compilermagie aus? Ich verstehe nicht, wieso man extra einen Header dafür macht. Datentypen wie float oder int werden doch auch intern abgehanelt.

    Den {}-Operator für Initialisierungslisten kann man auch nicht überschreiben oder?



  • Compilermagier schrieb:

    Wie sieht denn diese Compilermagie aus?

    Die sieht so aus, dass der Compiler für {a,b,c,d} irgendwo ein lokales Array anlegt, in dem er Kopien von a, b, c und d ablegt, und der initializer_list einen Pointer auf a und die Länge des Arrays mitgibt. Wenn a,b,c und d allesamt Literale sind, kann er die gesamte Liste sogar im statischen Datenbereich des Programms ablegen.



  • Compilermagier schrieb:

    Wie sieht denn diese Compilermagie aus? Ich verstehe nicht, wieso man extra einen Header dafür macht. Datentypen wie float oder int werden doch auch intern abgehanelt.

    Den {}-Operator für Initialisierungslisten kann man auch nicht überschreiben oder?

    Ein int oder float hat aber auch keine Memberfunktionen.



  • Compilermagier schrieb:

    Den {}-Operator für Initialisierungslisten kann man auch nicht überschreiben oder?

    Nein, den kannst du überhaupt nie überschreiben. Ist das überhaupt ein Operator?



  • Nope, ist kein Operator.


Anmelden zum Antworten