Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Nilai Pulangan `std::initializer_list` Sepanjang Hayat Berbeza Antara GCC dan Clang?

Mengapa Nilai Pulangan `std::initializer_list` Sepanjang Hayat Berbeza Antara GCC dan Clang?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-28 10:06:02970semak imbas

Why Does the Lifetime of an `std::initializer_list` Return Value Differ Between GCC and Clang?

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

  • GCC: Ikut piawai dan memusnahkan tatasusunan pada penghujung pernyataan pulangan.
  • Clang: Memanjangkan hayat tatasusunan melebihi pernyataan pulangan tetapi gagal memusnahkan pemusnah objek dengan betul.
  • Standard adalah samar-samar mengenai objek initializer_list yang menentukan hayat tatasusunan.

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!

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