Perché non è std::initializer_listintegrato un linguaggio di base?
Mi sembra che sia una caratteristica abbastanza importante di C ++ 11 e tuttavia non ha una propria parola chiave riservata (o qualcosa di simile).
Invece, initializer_listè solo una classe modello dalla libreria standard che ha una speciale mappatura implicita dalla nuova sintassi con parentesi graffe-init-list {...} gestita dal compilatore.
A prima vista, questa soluzione è piuttosto hacker .
È questo il modo in cui verranno implementate le nuove aggiunte al linguaggio C ++: dai ruoli impliciti di alcune classi modello e non dal linguaggio principale ?
Si prega di considerare questi esempi:
widget<int> w = {1,2,3}; //this is how we want to use a class
perché è stata scelta una nuova classe:
widget( std::initializer_list<T> init )
invece di usare qualcosa di simile a una qualsiasi di queste idee:
widget( T[] init, int length ) // (1)
widget( T... init ) // (2)
widget( std::vector<T> init ) // (3)
- un array classico, potresti probabilmente aggiungere
constqua e là - tre punti esistono già nella lingua (var-args, ora variadic templates), perché non riutilizzare la sintassi (e farla sentire incorporata )
- solo un contenitore esistente, potrebbe aggiungere
conste&
Tutti loro fanno già parte della lingua. Ho scritto solo le mie prime 3 idee, sono sicuro che ci sono molti altri approcci.
std::array<T>non fa più "parte della lingua" di std::initializer_list<T>. E questi non sono quasi gli unici componenti di libreria su cui si basa il linguaggio. See new/ delete, type_info, vari tipi di eccezione, size_te così via
const T(*)[N], perché si comporta in modo molto simile a come std::initializer_listfunziona.
std::arrayo un array di dimensioni statiche sono alternative meno desiderabili.