Rumah >pembangunan bahagian belakang >C++ >Adakah GCC Memusnahkan Tatasusunan `std::initializer_list` Dikembalikan daripada Fungsi Sebelum Tamat Pemulangan Ekspresi Penuh?

Adakah GCC Memusnahkan Tatasusunan `std::initializer_list` Dikembalikan daripada Fungsi Sebelum Tamat Pemulangan Ekspresi Penuh?

Linda Hamilton
Linda Hamiltonasal
2024-10-29 09:35:30485semak imbas

 Does GCC Destroy `std::initializer_list` Arrays Returned from Functions Before the End of the Return Full-Expression?

Seumur hidup std::initializer_list Nilai Pulangan

Ikhtisar

Soalan: Adakah betul pelaksanaan GCC memusnahkan tatasusunan std::initializer_list dikembalikan daripada fungsi pada penghujung ungkapan penuh pulangan?

Analisis

Jawapan: Tidak, ini tidak betul.

Penjelasan Terperinci

Mengikut piawaian C 11, pernyataan pemulangan dengan braced-init-list memulakan objek atau rujukan untuk dikembalikan melalui copy-list-initialization daripada senarai pemula yang ditentukan. Apabila senarai pemula digunakan untuk mencipta objek senarai permulaan, tatasusunan diperuntukkan untuk menyimpan elemen senarai. Jangka hayat tatasusunan ditakrifkan seperti berikut:

Hayat tatasusunan adalah sama seperti objek senarai_pemula.

Dalam contoh yang disediakan, objek senarai_pemula dicipta sebagai pulangan nilai daripada fungsi send(). Ia dimulakan dengan tiga objek noisydt dan kemudian dikembalikan kepada fungsi receive(). Jangka hayat tatasusunan yang dikaitkan dengan objek initializer_list harus dilanjutkan ke dalam fungsi receive(), membenarkan elemen senarai diakses dan digunakan.

Walau bagaimanapun, pelaksanaan GCC secara salah memusnahkan tatasusunan sebelum nilai pulangan boleh digunakan, mengakibatkan tingkah laku yang tidak ditentukan. Tingkah laku yang betul adalah untuk tatasusunan berterusan sehingga penghujung fungsi receive(). Kedua-dua Clang dan ICC menunjukkan tingkah laku yang betul.

Kesimpulan

Pengendalian pelaksanaan GCC bagi nilai pulangan std::initializer_list tidak mengikut piawaian C 11. Clang dan ICC menyediakan pelaksanaan yang betul dan disyorkan untuk menggunakan pengkompil ini apabila bekerja dengan std::initializer_lists.

Atas ialah kandungan terperinci Adakah GCC Memusnahkan Tatasusunan `std::initializer_list` Dikembalikan daripada Fungsi Sebelum Tamat Pemulangan Ekspresi Penuh?. 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