Rumah >pembangunan bahagian belakang >C++ >Bolehkah Kita Memindahkan Elemen dengan Selamat daripada `std::initializer_list` dalam C ?
Dalam C , senarai pemula, ditandakan sebagai std::initializer_list
Dalam coretan kod di bawah, fungsi foo menerima senarai pemula sebagai hujah:
#include <initializer_list> #include <utility> template<typename T> void foo(std::initializer_list<T> list) { for (auto it = list.begin(); it != list.end(); ++it) { bar(std::move(*it)); // Intended to move the element } }
Kebimbangan timbul kerana std::initializer_list
Malangnya, jangkaan pergerakan elemen lancar adalah tidak berasas. Percubaan untuk memindahkan elemen daripada senarai pemula akan menghasilkan hasil yang tidak dijangka. Daripada memindahkan elemen, salinan dibuat. Tingkah laku ini berpunca daripada fakta bahawa permulaan dan akhir berfungsi dalam std::initializer_list
Oleh itu, ungkapan gerak yang digunakan dalam bar(std::move(*it)) mengikat pada parameter fungsi jenis T const &, mengekalkan salinan dengan berkesan.
Sebab pengehadan ini adalah disebabkan oleh prerogatif penyusun untuk membuat instantiate std::initializer_list sebagai pemalar yang dimulakan secara statik. Membenarkan hasil boleh ubah dari permulaan dan akhir akan menghalang pengoptimuman ini, memperkenalkan kerumitan dalam reka bentuk pengkompil.
Walaupun terdapat tingkah laku yang tidak dijangka, penyelesaian mungkin terletak di kaki langit. [Cadangan ISO](https://github.com/CaseyCarter/iso-changes/blob/master/icpp/p1716r4.md) berusaha untuk memperkenalkan sokongan senarai pemula untuk jenis bergerak sahaja. Usaha ini bertujuan untuk meningkatkan keupayaan bahasa dan menyediakan pendekatan yang lebih konsisten untuk bekerja dengan senarai pemula dan menggerakkan semantik.
Atas ialah kandungan terperinci Bolehkah Kita Memindahkan Elemen dengan Selamat daripada `std::initializer_list` dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!