Rumah >pembangunan bahagian belakang >C++ >Bolehkah Elemen Dialihkan Keluar daripada `std::initializer_list`?

Bolehkah Elemen Dialihkan Keluar daripada `std::initializer_list`?

DDD
DDDasal
2024-12-20 14:10:14481semak imbas

Can Elements Be Moved Out of a `std::initializer_list`?

inisializer_list dan Move Semantics

Jenis initializer_list dalam C sering digunakan untuk memulakan bekas dengan senarai nilai yang disertakan dengan pendakap. Walau bagaimanapun, tidak seperti bekas biasa, initializer_list tidak mengikut nilai semantik. Akibatnya, soalan biasa timbul:

Bolehkah elemen dialih keluar daripada std::initializer_list?

Jawapan kepada soalan ini ialah tidak. Percubaan untuk berbuat demikian akan menghasilkan salinan, walaupun elemen yang dialihkan adalah daripada jenis bergerak sahaja. Ini kerana fungsi begin() dan end() initializer_list mengembalikan penunjuk kepada nilai const. Apabila std::move digunakan pada nilai const, hasilnya ialah rujukan rnilai tidak berubah, yang tidak boleh dialihkan secara bermakna. Sebaliknya, ia akan terikat pada parameter fungsi jenis const T&, menghasilkan semantik salinan.

Tingkah laku ini mungkin kelihatan tidak dijangka, memandangkan initializer_list bertujuan untuk menyimpan senarai objek sementara. Walau bagaimanapun, adalah dipercayai bahawa membuat jenis const atau boleh ubah mengikut budi bicara pengkompil akan membolehkan untuk permulaan statik senarai yang lebih cekap.

Kemas kini: Cadangan untuk Sokongan initializer_list bagi Jenis-Jenis Alih Sahaja

Sebagai tindak balas kepada maklum balas, cadangan ISO telah dirangka untuk menyediakan sokongan untuk jenis bergerak sahaja dalam senarai_pemula. Cadangan ini masih dalam semakan, tetapi ia menawarkan penyelesaian yang berpotensi untuk had semasa initializer_list apabila bekerja dengan jenis bergerak sahaja.

Atas ialah kandungan terperinci Bolehkah Elemen Dialihkan Keluar daripada `std::initializer_list`?. 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