Namespaces
Variants

std:: initializer_list

From cppreference.net
Utilities library

(à ne pas confondre avec member initializer list )

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 fournit un accès à un tableau d'objets de type const T (qui peut être alloué en mémoire morte).

Un objet std::initializer_list est automatiquement construit lorsque :

std::initializer_list peut être implémenté comme une paire de pointeurs ou un pointeur et une longueur. Copier un 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.

Table des matières

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)
spécialise std::end
(modèle de fonction)
Modèles de fonctions libres surchargés pour std::initializer_list
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)
vue de chaîne en lecture seule
(modèle de classe)