Namespaces
Variants

std:: initializer_list

From cppreference.net
Utilities library

(no confundir con member initializer list )

Definido en el encabezado <initializer_list>
template < class T >
class initializer_list ;
(desde C++11)

Un objeto de tipo std::initializer_list<T> es un objeto proxy ligero que proporciona acceso a un array de objetos de tipo const T (que puede estar ubicado en memoria de solo lectura).

Un objeto std::initializer_list se construye automáticamente cuando:

std::initializer_list puede implementarse como un par de punteros o un puntero y longitud. Copiar un std::initializer_list no copia el array subyacente de la lista de inicialización correspondiente.

El programa está mal formado si se declara una especialización explícita o parcial de std::initializer_list .

Contenidos

Tipos de miembros

Nombre Definición
value_type T
reference const T &
const_reference const T &
size_type std::size_t
iterator const T *
const_iterator const T *

Funciones miembro

crea una lista de inicialización vacía
(función miembro pública)
Capacidad
devuelve el número de elementos en la lista de inicialización
(función miembro pública)
Iteradores
devuelve un puntero al primer elemento
(función miembro pública)
devuelve un puntero a un elemento después del último
(función miembro pública)

Funciones no miembro

sobrecarga std::begin
(plantilla de función)
especializa std::end
(plantilla de función)
Plantillas de función libres sobrecargadas para std::initializer_list
devuelve un iterador inverso al inicio de un contenedor o array
(plantilla de función)
(C++14)
devuelve un iterador inverso final para un contenedor o array
(plantilla de función)
(C++17)
comprueba si el contenedor está vacío
(plantilla de función)
(C++17)
obtiene el puntero al array subyacente
(plantilla de función)

Notas

Macro de prueba de características Valor Std Característica
__cpp_initializer_lists 200806L (C++11) Inicialización de lista y std::initializer_list

Ejemplo

#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 << "constructed with a " << l.size() << "-element list\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()}; // copy list-initialization in return statement
                                  // this is NOT a use of std::initializer_list
    }
};
template<typename T>
void templated_fn(T) {}
int main()
{
    S<int> s = {1, 2, 3, 4, 5}; // copy list-initialization
    s.append({6, 7, 8});        // list-initialization in function call
    std::cout << "The vector now has " << s.c_arr().second << " ints:\n";    
    for (auto n : s.v)
        std::cout << n << ' ';
    std::cout << '\n';
    std::cout << "Range-for over brace-init-list: \n";
    for (int x : {-1, -2, -3}) // the rule for auto makes this ranged-for work
        std::cout << x << ' ';
    std::cout << '\n';
    auto al = {10, 11, 12}; // special rule for auto
    std::cout << "The list bound to auto has size() = " << al.size() << '\n';
    auto la = al; // a shallow-copy of top-level proxy object
    assert(la.begin() == al.begin()); // guaranteed: backing array is the same
    std::initializer_list<int> il{-3, -2, -1};
    assert(il.begin()[2] == -1); // note the replacement for absent operator[]
    il = al; // shallow-copy
    assert(il.begin() == al.begin()); // guaranteed
//  templated_fn({1, 2, 3}); // compiler error! "{1, 2, 3}" is not an expression,
                             // it has no type, and so T cannot be deduced
    templated_fn<std::initializer_list<int>>({1, 2, 3}); // OK
    templated_fn<std::vector<int>>({1, 2, 3});           // also OK
}

Salida:

constructed with a 5-element list
The vector now has 8 ints:
1 2 3 4 5 6 7 8
Range-for over brace-init-list:
-1 -2 -3
The list bound to auto has size() = 3

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 2129 C++11 std::initializer_list podría tener
especializaciones explícitas o parciales
el programa está
mal formado en este caso

Véase también

(C++20)
una vista no propietaria sobre una secuencia contigua de objetos
(plantilla de clase)
vista de cadena de solo lectura
(plantilla de clase)