Warum ist keine std::initializer_list
Kernsprache eingebaut?
Es scheint mir, dass es ein ziemlich wichtiges Feature von C ++ 11 ist und dennoch kein eigenes reserviertes Schlüsselwort (oder ähnliches) hat.
Stattdessen handelt initializer_list
es sich nur um eine Vorlagenklasse aus der Standardbibliothek, die über eine spezielle implizite Zuordnung aus der neuen Syntax der Klammer-Init-Liste verfügt {...}
, die vom Compiler verarbeitet wird.
Auf den ersten Blick ist diese Lösung ziemlich hackig .
Werden auf diese Weise neue Ergänzungen zur C ++ - Sprache implementiert: durch implizite Rollen einiger Vorlagenklassen und nicht durch die Kernsprache ?
Bitte beachten Sie diese Beispiele:
widget<int> w = {1,2,3}; //this is how we want to use a class
Warum wurde eine neue Klasse gewählt:
widget( std::initializer_list<T> init )
anstatt etwas Ähnliches wie eine dieser Ideen zu verwenden:
widget( T[] init, int length ) // (1)
widget( T... init ) // (2)
widget( std::vector<T> init ) // (3)
- Ein klassisches Array, das Sie wahrscheinlich
const
hier und da hinzufügen könnten - drei Punkte sind bereits in der Sprache (var-args, jetzt variadische Vorlagen), warum nicht wieder verwendet die Syntax (und macht sie fühlen Built-in )
- nur ein vorhandener Container, könnte hinzufügen
const
und&
Alle von ihnen sind bereits ein Teil der Sprache. Ich habe nur meine 3 ersten Ideen geschrieben, ich bin mir sicher, dass es viele andere Ansätze gibt.
std::array<T>
ist nicht mehr "Teil der Sprache" als std::initializer_list<T>
. Und dies sind bei weitem nicht die einzigen Bibliothekskomponenten, auf die sich die Sprache stützt. See new
/ delete
, type_info
verschiedene Ausnahmetypen, size_t
etc.
const T(*)[N]
, denn das verhält sich sehr ähnlich wie es std::initializer_list
funktioniert.