Pourquoi std::initializer_list
un langage de base n'est-il pas intégré?
Il me semble que c'est une fonctionnalité assez importante de C ++ 11 et pourtant il n'a pas son propre mot-clé réservé (ou quelque chose de similaire).
Au lieu de cela, initializer_list
il s'agit simplement d' une classe de modèle de la bibliothèque standard qui a un mappage implicite spécial de la nouvelle syntaxe braced-init-list {...}
qui est gérée par le compilateur.
À première vue, cette solution est assez piratée .
Est-ce ainsi que les nouveaux ajouts au langage C ++ seront désormais implémentés: par les rôles implicites de certaines classes de modèles et non par le langage de base ?
Veuillez considérer ces exemples:
widget<int> w = {1,2,3}; //this is how we want to use a class
pourquoi une nouvelle classe a-t-elle été choisie:
widget( std::initializer_list<T> init )
au lieu d'utiliser quelque chose de similaire à l'une de ces idées:
widget( T[] init, int length ) // (1)
widget( T... init ) // (2)
widget( std::vector<T> init ) // (3)
- un tableau classique, vous pourriez probablement ajouter
const
ici et là - trois points existent déjà dans le langage (var-args, maintenant des modèles variadiques), pourquoi ne pas réutiliser la syntaxe (et la faire sentir intégrée )
- juste un conteneur existant, pourrait ajouter
const
et&
Tous font déjà partie de la langue. Je n'ai écrit que mes 3 premières idées, je suis sûr qu'il existe de nombreuses autres approches.
std::array<T>
ne fait pas plus partie de la langue que std::initializer_list<T>
. Et ce ne sont pas les seuls composants de bibliothèque sur lesquels le langage s'appuie. Voir new
/ delete
, type_info
, divers types d'exceptions, size_t
etc.
const T(*)[N]
, parce que cela se comporte de manière très similaire à la façon dont std::initializer_list
fonctionne.