Saya hanya akan menambahkan sedikit rincian lebih lanjut. Array yang mendasari std::initializer_listberperilaku 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 Xdibuat (dengan mengubah konstruktor dari 1) dan dihancurkan juga. Referensi yang disimpan ke dalam pkemudian 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 lkeluar. 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 lkemudian menghasilkan perilaku yang tidak terdefinisi.
Demo langsung ada di sini .
std::pair.