std::initializer_list
(à ne pas confondre avec liste d'initialisation des membres)
| Défini dans l'en-tête <initializer_list>
|
||
template< class T >
class initializer_list;
|
(depuis C++11) | |
Un objet de type std::initializer_list<T> est un objet proxy léger qui donne accès à un tableau d'objets de type const T (qui peut être alloué en mémoire en lecture seule).
Un objet std::initializer_list est automatiquement construit lorsque :
- une liste d'initialisation entre accolades est utilisée pour initialiser par liste un objet, où le constructeur correspondant accepte un paramètre de type
std::initializer_list, - une liste d'initialisation entre accolades est utilisée comme opérande droit de l'affectation ou comme argument d'appel de fonction, et l'opérateur d'affectation/la fonction correspondant(e) accepte un paramètre de type
std::initializer_list, - une liste d'initialisation entre accolades est liée à auto, y compris dans une boucle for basée sur une plage.
std::initializer_list peut être implémenté comme une paire de pointeurs ou un pointeur et une longueur. Copier un objet std::initializer_list ne copie pas le tableau sous-jacent de la liste d'initialisation correspondante.
Le programme est mal formé si une spécialisation explicite ou partielle de std::initializer_list est déclarée.
Types membres
| Nom | Définition |
value_type
|
T
|
reference
|
const T & |
const_reference
|
const T & |
size_type
|
std::size_t |
iterator
|
const T * |
const_iterator
|
const T * |
Fonctions membres
|
crée une liste d'initialisation vide
(fonction membre publique) |
|
Capacité |
|
|
retourne le nombre d'éléments dans la liste d'initialisation
(fonction membre publique) |
|
Itérateurs |
|
|
retourne un pointeur vers le premier élément
(fonction membre publique) |
|
|
retourne un pointeur vers l'élément suivant le dernier
(fonction membre publique) |
|
Fonctions non membres
|
surcharge
std::begin
(modèle de fonction) |
|
|
(C++11)
|
spécialise
std::end
(modèle de fonction) |
Modèles de fonctions libres surchargés pour
|
|
|
(C++14)
|
retourne un itérateur inverse vers le début d'un conteneur ou d'un tableau
(modèle de fonction) |
|
(C++14)
|
retourne un itérateur inverse de fin pour un conteneur ou un tableau
(modèle de fonction) |
|
(C++17)
|
vérifie si le conteneur est vide
(modèle de fonction) |
|
(C++17)
|
obtient le pointeur vers le tableau sous-jacent
(modèle de fonction) |
Notes
| Macro de test de fonctionnalité | Valeur | Std | Fonctionnalité |
|---|---|---|---|
__cpp_initializer_lists
|
200806L
|
(C++11) |
Initialisation de liste
et
std::initializer_list
|
Exemple
#include <cassert> #include <initializer_list> #include <iostream> #include <vector> template<class T> struct S { std::vector<T> v; S(std::initializer_list<T> l) : v(l) { std::cout << "construit avec une liste de " << l.size() << " éléments\n"; } void append(std::initializer_list<T> l) { v.insert(v.end(), l.begin(), l.end()); } std::pair<const T*, std::size_t> c_arr() const { return {&v[0], v.size()}; // initialisation par liste en copie dans l'instruction return // ceci n'est PAS une utilisation de std::initializer_list } }; template<typename T> void templated_fn(T) {} int main() { S<int> s = {1, 2, 3, 4, 5}; // initialisation par liste en copie s.append({6, 7, 8}); // initialisation par liste dans l'appel de fonction std::cout << "Le vecteur contient maintenant " << s.c_arr().second << " entiers:\n"; for (auto n : s.v) std::cout << n << ' '; std::cout << '\n'; std::cout << "Boucle for sur liste d'initialisation entre accolades: \n"; for (int x : {-1, -2, -3}) // la règle pour auto permet à cette boucle for de fonctionner std::cout << x << ' '; std::cout << '\n'; auto al = {10, 11, 12}; // règle spéciale pour auto std::cout << "La liste liée à auto a size() = " << al.size() << '\n'; auto la = al; // copie superficielle de l'objet proxy de haut niveau assert(la.begin() == al.begin()); // garanti : le tableau sous-jacent est le même std::initializer_list<int> il{-3, -2, -1}; assert(il.begin()[2] == -1); // notez le remplacement pour l'opérateur [] absent il = al; // copie superficielle assert(il.begin() == al.begin()); // garanti // templated_fn({1, 2, 3}); // erreur de compilation ! "{1, 2, 3}" n'est pas une expression, // il n'a pas de type, donc T ne peut pas être déduit templated_fn<std::initializer_list<int>>({1, 2, 3}); // OK templated_fn<std::vector<int>>({1, 2, 3}); // également OK }
Sortie :
construit avec une liste de 5 éléments Le vecteur contient maintenant 8 entiers: 1 2 3 4 5 6 7 8 Boucle for sur liste d'initialisation entre accolades: -1 -2 -3 La liste liée à auto a size() = 3
Rapports de défauts
Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.
| DR | Appliqué à | Comportement publié | Comportement correct |
|---|---|---|---|
| LWG 2129 | C++11 |
std::initializer_list
pouvait avoir des spécialisations
explicites ou partielles |
le programme est
mal formé dans ce cas |
Voir aussi
|
(C++20)
|
une vue non propriétaire sur une séquence contiguë d'objets
(modèle de classe) |
|
(C++17)
|
vue de chaîne en lecture seule
(modèle de classe) |