Saya hanya akan menambahkan sedikit rincian lebih lanjut. Array yang mendasari std::initializer_list
berperilaku jenis-sama seperti temporaries. Pertimbangkan kelas berikut:
struct X
{
X(int i) { std::cerr << "ctor\n"; }
~X() { std::cerr << "dtor\n"; }
};
dan penggunaannya dalam kode berikut:
std::pair<const X&, int> p(1, 2);
std::cerr << "barrier\n";
Mencetak
ctor
dtor
barrier
sejak pada baris pertama, instance sementara dari tipe X
dibuat (dengan mengubah konstruktor dari 1
) dan dihancurkan juga. Referensi yang disimpan ke dalam p
kemudian menggantung.
Adapun std::initializer_list
, jika Anda menggunakannya dengan cara ini:
{
std::initializer_list<X> l { 1, 2 };
std::cerr << "barrier\n";
}
kemudian, array (sementara) yang mendasari ada selama l
keluar. Oleh karena itu, outputnya adalah:
ctor
ctor
barrier
dtor
dtor
Namun, jika Anda beralih ke
std::pair<std::initializer_list<X>, int> l { {1}, 2 };
std::cerr << "barrier\n";
Outputnya lagi
ctor
dtor
barrier
karena array (sementara) yang mendasarinya hanya ada di baris pertama. Mendereferensikan pointer ke elemen yang l
kemudian menghasilkan perilaku yang tidak terdefinisi.
Demo langsung ada di sini .
std::pair
.