Mengapa kode ini menulis sejumlah bilangan bulat yang tampaknya tidak diinisialisasi?
#include <iostream>
#include <vector>
using namespace std;
int main()
{
for (int i : vector<vector<int>>{{77, 777, 7777}}[0])
cout << i << ' ';
}
Saya mengharapkan hasilnya 77 777 7777
.
Apakah kode ini seharusnya tidak terdefinisi?
using std::vector
alih-alihusing namespace std;
untuk mencegah praktik buruk ini menyebar.Ini karena vektor yang Anda iterasi akan dihancurkan sebelum memasuki loop.
Inilah yang biasanya terjadi:
Masalahnya dimulai pada baris pertama karena dievaluasi sebagai berikut:
Pertama-tama buatlah vektor vektor dengan argumen yang diberikan dan vektor itu menjadi sementara karena tidak memiliki nama.
Kemudian referensi rentang terikat ke vektor yang disandikan yang hanya akan valid selama vektor yang memuatnya valid.
Setelah titik koma tercapai, vektor sementara dihancurkan dan dalam destruktornya ia akan menghancurkan dan membatalkan alokasi semua vektor yang tersimpan yang mencakup yang disandikan.
Anda berakhir dengan referensi ke vektor hancur yang akan diiterasi.
Untuk menghindari masalah ini ada dua solusi:
Deklarasikan vektor sebelum loop sehingga ia bertahan sampai cakupannya berakhir yang mencakup loop.
C ++ 20 datang dengan pernyataan init yang disediakan untuk menyelesaikan masalah ini dan lebih baik daripada pendekatan pertama jika Anda ingin vektor dihancurkan setelah loop segera:
sumber
Saya berharap ini menjuntai.
Meskipun definisi rentang-untuk memastikan bahwa RHS usus besar tetap "hidup" selama jangka waktu, Anda masih berlangganan sementara. Hanya hasil dari subskrip disimpan, tetapi hasil itu adalah referensi, dan vektor yang sebenarnya tidak dapat bertahan melewati ekspresi penuh yang dinyatakannya. Itu tidak menggambarkan keseluruhan loop.
sumber