Sadece biraz daha ayrıntı eklerdim. Altta yatan bir dizi, std::initializer_list
geçici olarak benzer şekilde davranır. Aşağıdaki sınıfı düşünün:
struct X
{
X(int i) { std::cerr << "ctor\n"; }
~X() { std::cerr << "dtor\n"; }
};
ve aşağıdaki kodda kullanımı:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
Çıktı
ctor
dtor
barrier
çünkü ilk satırda geçici bir tür örneği X
oluşturulur (yapıcıyı dönüştürerek 1
) ve yok eder. Saklanan referans p
daha sonra sarkar.
Gelince std::initializer_list
, bu şekilde kullanırsanız:
{
std::initializer_list<X> l { 1, 2 };
std::cerr << "barrier\n";
}
ardından, altta yatan (geçici) dizi, l
çıkışlar olduğu sürece mevcuttur . Bu nedenle, çıktı:
ctor
ctor
barrier
dtor
dtor
Ancak,
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
Çıktı yine
ctor
dtor
barrier
çünkü temel (geçici) dizi sadece ilk satırda bulunur. İmlecin öğelerinin kaydının silinmesi, l
tanımlanmamış davranışla sonuçlanır.
Canlı demo burada .
std::pair
.