Soalan: Adakah betul pelaksanaan GCC memusnahkan tatasusunan std::initializer_list dikembalikan daripada fungsi pada penghujung ungkapan penuh pulangan?
Jawapan: Tidak, ini tidak betul.
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.
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!