Solo agregaría un poco más de detalles. Una serie subyacente de std::initializer_list
comportamientos de forma similar a los temporales. Considere la siguiente clase:
struct X
{
X(int i) { std::cerr << "ctor\n"; }
~X() { std::cerr << "dtor\n"; }
};
y su uso en el siguiente código:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
Se imprime
ctor
dtor
barrier
dado que en la primera línea, X
se crea una instancia temporal de tipo (al convertir el constructor de 1
) y también se destruye. La referencia almacenada p
entonces está colgando.
En cuanto a std::initializer_list
, si lo usa de esta manera:
{
std::initializer_list<X> l { 1, 2 };
std::cerr << "barrier\n";
}
entonces, la matriz subyacente (temporal) existe mientras exista l
. Por lo tanto, la salida es:
ctor
ctor
barrier
dtor
dtor
Sin embargo, si cambia a
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
La salida es de nuevo
ctor
dtor
barrier
ya que la matriz subyacente (temporal) existe solo en la primera línea. Desreferenciar el puntero a los elementos de l
entonces resulta en un comportamiento indefinido.
La demostración en vivo está aquí .
std::pair
.