Chciałbym tylko dodać trochę więcej szczegółów. Podstawowa tablica std::initializer_list
zachowuje 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 X
tworzona jest tymczasowa instancja typu (poprzez konwersję konstruktora z 1
), a także niszczona. Zapisane w nim odwołanie p
zwisa.
Jeśli zaś std::initializer_list
uż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 l
wyjś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, l
a następnie powoduje niezdefiniowane zachowanie.
Demo na żywo jest tutaj .
std::pair
.