Ich würde nur ein bisschen mehr Details hinzufügen. Ein zugrunde liegendes Array von std::initializer_listVerhaltensweisen verhält sich ähnlich wie temporäre. Betrachten Sie die folgende Klasse:
struct X
{
   X(int i) { std::cerr << "ctor\n"; }
   ~X() { std::cerr << "dtor\n"; }
};
und seine Verwendung im folgenden Code:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
Es wird ausgedruckt 
ctor
dtor
barrier
da in der ersten Zeile eine temporäre Instanz des Typs Xerstellt (durch Konvertieren des Konstruktors von 1) und ebenfalls zerstört wird. Die darin gespeicherte Referenz pbaumelt dann.
Was std::initializer_list, wenn Sie es auf diese Weise verwendet werden :
{
   std::initializer_list<X> l { 1, 2 };
   std::cerr << "barrier\n";
}
Dann existiert das zugrunde liegende (temporäre) Array, solange es beendet wird l. Daher lautet die Ausgabe:
ctor
ctor
barrier
dtor
dtor
Wenn Sie jedoch zu wechseln 
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
Die Ausgabe ist wieder
ctor
dtor
barrier
da das zugrunde liegende (temporäre) Array nur in der ersten Zeile vorhanden ist. Das Dereferenzieren des Zeigers auf die Elemente von lführt zu einem undefinierten Verhalten.
Live-Demo ist da .
               
              
std::pair.