Rumah >pembangunan bahagian belakang >C++ >Adakah Pemusnahan GCC Terhadap Tatasusunan `std::initializer_list` yang Dipulangkan Betul?

Adakah Pemusnahan GCC Terhadap Tatasusunan `std::initializer_list` yang Dipulangkan Betul?

Linda Hamilton
Linda Hamiltonasal
2024-11-01 17:08:02441semak imbas

Is GCC's Destruction of a Returned `std::initializer_list` Array Correct?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn