std::initializer_list
(lista de inicializadores)
(no debe confundirse con la lista de inicializadores de miembros)
Definido en el archivo de encabezado <initializer_list> | ||
template<typename T > class initializer_list; | (desde C++11) | |
Un objeto de tipo std::initializer_list<T>
es un objeto proxy de peso ligero que proporciona acceso a un array de objetos de tipo const T
.
Un objeto std::initializer_list
se construye automáticamente cuando:
- se usa una lista de inicializadores entre llaves para inicializar un objeto mediante la inicialización de lista, donde el constructor correspondiente acepta un parámetro de tipo
std::initializer_list
. - se usa una lista de inicializadores entre llaves como el operando del lado derecho de una asignación o como un argumento de llamada a función, y el operador/función de asignación correspondiente acepta un parámetro de tipo
std::initializer_list
. - una lista de inicializadores entre llaves se vincula a auto, incluyendo en un bucle
for
basado en rango.
Las listas de inicializadores pueden implementarse como un par de punteros o puntero y longitud. Copiar un objeto de tipo std::initializer_list
no copia los objetos subyacentes.
El array subyacente es un arraytemporal de tipo const T[N]
, en el que cada elemento es inicializado por copia (excepto que las conversiones de estrechamiento no son válidas) del elemento correspondiente de la lista de inicializadores original. El tiempo de vida del array subyacente es el mismo que cualquier otro objeto temporal, excepto que la inicialización de un objeto initializer_list
desde el array extiende el tiempo de vida del array exactamente como cuando se vincula una referencia a un temporal (con las mismas excepciones, como para inicializar un miembro de clase no estático). El array subyacente puede asignarse en memoria de solo lectura.
El programa está mal formado si se declara una especialización explícita o parcial de std::initializer_list
.
Contenido |
[editar]Tipos miembro
Tipo miembro | Definición |
value_type | T |
reference | const T& |
const_reference | const T& |
size_type | std::size_t |
iterator | const T* |
const_iterator | const T* |
[editar]Funciones miembro
Crea una lista de inicializadores vacía. (función miembro pública) | |
Capacidad | |
Devuelve el número de elementos en la lista de inicializadores. (función miembro pública) | |
Iteradores | |
Devuelve un puntero al primer elemento. (función miembro pública) | |
Devuelve un puntero al último elemento más uno (past-the-end). (función miembro pública) |
[editar]Funciones no miembro
Especialización de std::begin. (plantilla de función) | |
Especialización de std::end. (plantilla de función) | |
Plantillas de función independendientes sobrecargadas para | |
(C++14) | Devuelve un iterador inverso al contenedor o array (plantilla de función) |
(C++14) | Devuelve un iterador inverso al final para un contenedor o array (plantilla de función) |
(C++17) | Comprueba si un contenedor está vacío (plantilla de función) |
(C++17) | Obtiene el puntero al array subyacente. (plantilla de función) |
[editar]Ejemplo
#include <iostream>#include <vector>#include <initializer_list> template<typename T>struct S {std::vector<T> v; S(std::initializer_list<T> l): v(l){std::cout<<"Construido con una lista de "<< l.size()<<" elementos\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()};// inicialización de lista de copia en instrucción return// este NO es un uso de std::initializer_list}}; template<typename T>void templated_fn(T){} int main(){ S<int> s ={1, 2, 3, 4, 5};// inicialización de copia por lista s.append({6, 7, 8});// inicialización de copia por lista en llamada a función std::cout<<"El tamaño del vector ahora es "<< s.c_arr().second<<" enteros:\n"; for(auto n : s.v)std::cout<< n <<' ';std::cout<<'\n'; std::cout<<"Bucle for basado en rango sobre lista de inicializadores entre llaves: \n"; for(int x :{-1, -2, -3})// la regla para auto hace que este bucle for basado en rango funcionestd::cout<< x <<' ';std::cout<<'\n'; auto al ={10, 11, 12};// regla especial para auto std::cout<<"La lista vinculada a auto tiene size() = "<< al.size()<<'\n'; // templated_fn({1, 2, 3}); // ERROR: "{1, 2, 3}" no es una expresión,// no tiene tipo, así que T no puede deducirse templated_fn<std::initializer_list<int>>({1, 2, 3});// de acuerdo templated_fn<std::vector<int>>({1, 2, 3});// también de acuerdo}
Salida:
Construido con una lista de 5 elementos El tamaño del vector ahora es 8 enteros: 1 2 3 4 5 6 7 8 Bucle for basado en rango sobre lista de inicializadores entre llaves: -1 -2 -3 La lista vinculada a auto tiene size() = 3
[editar]Informes de defectos
Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.
ID | Aplicado a | Comportamiento según lo publicado | Comportamiento correcto |
---|---|---|---|
CWG 1290 | C++11 | El tiempo de vida del array subyacente referenciado por la initializer_list no estaba especificado correctamente. | Se especificó al igual que otros objetos temporales. |
CWG 1418 | C++11 | Al tipo del array subyacente le faltaba const. | Se le agregó const. |
LWG 2129 | C++11 | Se permitía especializar initializer_list pero no segarantizaba que funcionaría. | Se hizo mal formado. |
[editar]Véase también
(C++20) | Una vista que no es dueña sobre una secuencia contigua de objetos. (plantilla de clase) |
(C++17) | Vista sobre cadena de solo lectura. (plantilla de clase) |