Perché non è std::initializer_list
integrato 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
const
qua 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
const
e&
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_t
e così via
const T(*)[N]
, perché si comporta in modo molto simile a come std::initializer_list
funziona.
std::array
o un array di dimensioni statiche sono alternative meno desiderabili.