Ich würde nur ein bisschen mehr Details hinzufügen. Ein zugrunde liegendes Array von std::initializer_list
Verhaltensweisen 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 X
erstellt (durch Konvertieren des Konstruktors von 1
) und ebenfalls zerstört wird. Die darin gespeicherte Referenz p
baumelt 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 l
führt zu einem undefinierten Verhalten.
Live-Demo ist da .
std::pair
.