Chciałbym tylko dodać trochę więcej szczegółów. Podstawowa tablica std::initializer_listzachowuje się podobnie jak tymczasowe. Rozważ następującą klasę:
struct X
{
X(int i) { std::cerr << "ctor\n"; }
~X() { std::cerr << "dtor\n"; }
};
i jego użycie w następującym kodzie:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
Drukuje
ctor
dtor
barrier
ponieważ w pierwszym wierszu Xtworzona jest tymczasowa instancja typu (poprzez konwersję konstruktora z 1), a także niszczona. Zapisane w nim odwołanie pzwisa.
Jeśli zaś std::initializer_listużywasz go w ten sposób:
{
std::initializer_list<X> l { 1, 2 };
std::cerr << "barrier\n";
}
wtedy podstawowa (tymczasowa) tablica istnieje tak długo, jak lwyjścia. Dlatego wynik jest następujący:
ctor
ctor
barrier
dtor
dtor
Jeśli jednak przełączysz się na
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
Wyjście jest znowu
ctor
dtor
barrier
ponieważ podstawowa (tymczasowa) tablica istnieje tylko w pierwszym wierszu. Odsunięcie wskaźnika do elementów, la następnie powoduje niezdefiniowane zachowanie.
Demo na żywo jest tutaj .
std::pair.