Kode ini:
#include <iostream>
#include <string>
std::pair<std::initializer_list<std::string>, int> groups{ { "A", "B" }, 0 };
int main()
{
for (const auto& i : groups.first)
{
std::cout << i << '\n';
}
return 0;
}
mengkompilasi tetapi mengembalikan segfault. Mengapa?
Diuji pada gcc 8.3.0 dan pada kompiler online.
std::pair
.Jawaban:
std::initializer_list
tidak dimaksudkan untuk disimpan, itu hanya dimaksudkan untuk ... inisialisasi baik. Secara internal itu hanya menyimpan pointer ke elemen pertama dan ukurannya. Dalam kode Anda,std::string
objek adalah temporer daninitializer_list
tidak ada yang memiliki kepemilikan atas mereka, tidak memperpanjang usia mereka, tidak juga menyalinnya (karena itu bukan wadah) sehingga mereka keluar dari ruang lingkup segera setelah penciptaan, tetapi Andainitializer_list
masih memegang pointer ke mereka. Itu sebabnya Anda mendapatkan kesalahan segmentasi.Untuk menyimpan, Anda harus menggunakan wadah, seperti
std::vector
ataustd::array
.sumber
initializer_list
. Tidak mungkin untuk menggunakan objek hanya bergerak, jadi Anda tidak dapat menggunakan init daftar dengan vektor unique_ptr misalnya. Ukuraninitializer_list
bukan konstanta waktu kompilasi. Dan fakta itustd::vector<int>(3)
danstd::vector<int>{3}
melakukan hal-hal yang sama sekali berbeda. Membuatku sedih :(Saya hanya akan menambahkan sedikit rincian lebih lanjut. Array yang mendasari
std::initializer_list
berperilaku jenis-sama seperti temporaries. Pertimbangkan kelas berikut:dan penggunaannya dalam kode berikut:
Mencetak
sejak pada baris pertama, instance sementara dari tipe
X
dibuat (dengan mengubah konstruktor dari1
) dan dihancurkan juga. Referensi yang disimpan ke dalamp
kemudian menggantung.Adapun
std::initializer_list
, jika Anda menggunakannya dengan cara ini:kemudian, array (sementara) yang mendasari ada selama
l
keluar. Oleh karena itu, outputnya adalah:Namun, jika Anda beralih ke
Outputnya lagi
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 .
sumber