Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Adakah Nilai Pulangan `std::initializer_list` Sepanjang Hayat Dilanjutkan ke dalam Fungsi Panggilan?

Adakah Nilai Pulangan `std::initializer_list` Sepanjang Hayat Dilanjutkan ke dalam Fungsi Panggilan?

Patricia Arquette
Patricia Arquetteasal
2024-10-28 22:44:02997semak imbas

Does the Lifetime of a `std::initializer_list` Return Value Extend into the Calling Function?

Seumur hidup std::initializer_list Nilai Pulangan

Soalan:

Mengikut standard C, apabila fungsi mengembalikan senarai pemula, adakah jangka hayat tatasusunan asasnya dilanjutkan ke dalam fungsi panggilan?

Analisis

Piawaian C menyatakan bahawa jangka hayat objek std::initializer_list adalah sama dengan objek yang dimulakan. Apabila fungsi mengembalikan senarai pemula, ia memulakan objek nilai pulangan. Walau bagaimanapun, terdapat dua contoh senarai pemula yang terlibat: satu dalam fungsi dan satu dalam kod panggilan.

Contoh dalam piawaian menunjukkan bahawa jangka hayat tatasusunan memanjang ke objek yang disalin, yang akan membayangkan bahawa tatasusunan nilai pulangan juga harus bertahan dalam fungsi panggilan. Walau bagaimanapun, ini tidak berlaku dalam amalan.

Jawapan:

Pada masa ini, tingkah laku sepanjang hayat nilai pulangan std::initializer_list tidak ditakrifkan dengan jelas dalam piawaian C. Pengkompil yang berbeza melaksanakannya secara berbeza:

  • GCC tersilap memusnahkan tatasusunan sebelum kembali, sambil mengekalkan senarai pemula bernama.
  • Clang memproses contoh dengan betul daripada standard, tetapi tidak sekali-kali memusnahkan objek dalam senarai. Ini akan membawa kepada kebocoran memori.
  • ICC tidak menyokong senarai pemula sama sekali.

Kesimpulannya, pada masa ini tidak mungkin untuk bergantung pada hayat std:: nilai pulangan initializer_list meluas ke dalam fungsi panggilan. Elakkan menggunakan std::initializer_list untuk menghantar nilai, kerana ia boleh membawa kepada tingkah laku yang tidak dijangka.

Nota Tambahan:

DR 1290 mengubah suai perkataan standard dan DR 1565 dan 1599, yang masih terbuka, menangani isu berkaitan. Walau bagaimanapun, semantik masih ditakrifkan dan pengkompil akan mengambil masa untuk melaksanakan perubahan terakhir.

Atas ialah kandungan terperinci Adakah Nilai Pulangan `std::initializer_list` Sepanjang Hayat Dilanjutkan ke dalam Fungsi Panggilan?. 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