¿Por qué no está std::initializer_list
incorporado un lenguaje central?
Me parece que es una característica bastante importante de C ++ 11 y, sin embargo, no tiene su propia palabra clave reservada (o algo similar).
En cambio, initializer_list
es solo una clase de plantilla de la biblioteca estándar que tiene un mapeo implícito especial de la nueva sintaxis de lista de inicio con {...}
llaves que maneja el compilador.
A primera vista, esta solución es bastante peligrosa .
¿Es esta la forma en que se implementarán ahora las nuevas adiciones al lenguaje C ++: por roles implícitos de algunas clases de plantilla y no por el lenguaje central ?
Considere estos ejemplos:
widget<int> w = {1,2,3}; //this is how we want to use a class
por qué se eligió una nueva clase:
widget( std::initializer_list<T> init )
en lugar de usar algo similar a cualquiera de estas ideas:
widget( T[] init, int length ) // (1)
widget( T... init ) // (2)
widget( std::vector<T> init ) // (3)
- una matriz clásica, probablemente podría agregar
const
aquí y allá - ya existen tres puntos en el lenguaje (var-args, ahora plantillas variadic), ¿por qué no reutilizar la sintaxis (y hacer que se sienta incorporada )
- solo un contenedor existente, podría agregar
const
y&
Todos ellos ya forman parte del idioma. Solo escribí mis 3 primeras ideas, estoy seguro de que hay muchos otros enfoques.
std::array<T>
no es más "parte del lenguaje" que std::initializer_list<T>
. Y estos no son los únicos componentes de la biblioteca en los que se basa el lenguaje. Ver new
/ delete
, type_info
, diversos tipos de excepción, size_t
, etc.
const T(*)[N]
, porque se comporta de manera muy similar a cómo std::initializer_list
funciona.