Lifetime of Returned std::initializer_list Array
Hayat std::initializer_list tatasusunan yang dikembalikan daripada fungsi telah mencetuskan perbincangan mengenai tingkah laku dalam penyusun yang berbeza. Timbul persoalan sama ada pemusnahan tatasusunan GCC pada penghujung ungkapan penuh pengembalian adalah betul.
Analisis Standard
Mengikut C 11 §6.6. 3/2, pernyataan pemulangan dengan braced-init-list membawa kepada objek atau rujukan yang dikembalikan dimulakan senarai-salin daripada senarai pemula. Proses ini memulakan objek initializer_list sementara dan storan tatasusunan asasnya daripada senarai initializer, dan kemudian satu lagi initializer_list dimulakan daripada yang pertama.
Hayat tatasusunan, seperti yang ditakrifkan dalam 8.5.4/6, sepadan dengan seumur hidup objek initializer_list. Ini boleh difahami melalui contoh di mana objek dan tatasusunan initializer_list mempunyai jangka hayat ekspresi penuh untuk std::vector yang dimulakan dengan braced-init-list.
Nilai Pulangan Braced-Init -Senarai
Apabila senarai kosong yang disertakan dalam pendakap dikembalikan, permulaan senarai salin digunakan. Ini serupa dengan sintaks nocopy X = { 3 }, yang tidak melibatkan salinan dan sama dengan contoh dalam 8.5.4/6 di mana hayat tatasusunan dilanjutkan.
Isu dengan GCC dan Clang
Walau bagaimanapun, terdapat percanggahan dalam pelaksanaan antara GCC dan Clang. GCC memusnahkan tatasusunan sebelum kembali, manakala Clang mengekalkan senarai_inisialisasi bernama tetapi tidak sekali-kali memusnahkan objek dalam senarai.
Pengesyoran
Adalah dinasihatkan untuk mengelak daripada menggunakan std:: initializer_list untuk menghantar nilai dengan jangkaan nilai itu berterusan. Ketidakpastian dalam pelaksanaan standard dan pengkompil menjadikannya tidak boleh dipercayai untuk mengekalkan seumur hidup objek.
Atas ialah kandungan terperinci Adakah Pemusnahan GCC Terhadap Tatasusunan `std::initializer_list` yang Dipulangkan Betul?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!