Seumur hidup std::initializer_list Nilai Pulangan: GCC lwn. Gelagat Dentang
Dalam kod yang disediakan, anda memulangkan std ::initializer_list daripada fungsi dan memerhati tingkah laku pemusnah yang tidak dijangka. Khususnya, tatasusunan yang dikembalikan daripada fungsi dimusnahkan sebelum anda boleh mengakses elemennya.
Isu asas berpunca daripada fakta bahawa, menurut piawaian C, std::initializer_list mempunyai tatasusunan elemen yang dibina dengan jangka hayat yang sama seperti senarai_inisialisasi. Ini bermakna, secara lalai, tatasusunan dimusnahkan pada penghujung pernyataan pulangan dalam fungsi anda.
Pelaksanaan GCC mematuhi gelagat ini, manakala Clang tidak. Clang mengekalkan hayat tatasusunan melebihi penghujung penyata pulangan, yang tidak mematuhi piawaian. Walau bagaimanapun, tingkah laku Clang kelihatan tidak konsisten, kerana pemusnah objek tidak pernah dipanggil.
Pemulaan-Senarai-Salin dan Tafsiran Pengkompil
Pernyataan kembali dengan braced-init- list memulakan nilai pulangan melalui copy-list-initialization, yang bermaksud ia menyalin-memulakan objek sedia ada. Dalam kes ini, objek initializer_list sementara dimulakan salin daripada senarai yang disertakan dengan pendakap. Selepas itu, satu lagi objek initializer_list dimulakan salin daripada yang pertama.
Standard menyatakan bahawa hayat tatasusunan adalah sama dengan objek initializer_list, tetapi apabila berbilang salinan initializer_list dicipta, tidak jelas jangka hayat objek mana yang menentukan jangka hayat tatasusunan.
GCC mentafsir standard dengan mempertimbangkan jangka hayat objek initializer_list yang dikembalikan, yang membawa kepada kemusnahan pramatang tatasusunan. Walau bagaimanapun, contoh yang disediakan dalam 8.5.4/6 mencadangkan bahawa jangka hayat tatasusunan harus dilanjutkan ke penghujung ungkapan yang disertakan, termasuk fungsi penerimaan.
Ringkasan Gelagat Pengkompil dan Kekaburan Standard
Syor
Untuk mengelakkan tingkah laku yang tidak dijangka, ia biasanya tidak disyorkan untuk mengembalikan std::initializer_list mengikut nilai. Jika anda perlu menghantar bilangan objek yang berubah-ubah, pertimbangkan untuk menggunakan kelas kontena, seperti std::vector, sebaliknya.
Atas ialah kandungan terperinci Mengapa Nilai Pulangan `std::initializer_list` Sepanjang Hayat Berbeza Antara GCC dan Clang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!