Senarai Pemula dan Alih Semantik: Bolehkah saya Mengalihkan Elemen Keluar?
Persoalan timbul mengenai penggunaan senarai pemula dan memindahkan semantik: adakah ia dibenarkan untuk mengalihkan elemen keluar daripada std::initializer_list
Masalahnya
Pertimbangkan coretan kod berikut:
#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)); // kosher? } }
Di sini, kami ingin menyemak sama ada boleh alihkan unsur daripada a std::initializer_list.
Jawapannya
Anehnya, jawapannya tidak. Ungkapan std::move(*it) tidak akan menghasilkan pergerakan. Sebaliknya, ia menghasilkan rujukan rnilai tidak berubah jenis T const &&. Ini kerana kaedah permulaan dan penamat initializer_list mengembalikan const T *, yang tidak membenarkan semantik bergerak.
Alasan yang mungkin untuk ini adalah untuk membolehkan pengkompil mencipta initializer_list sebagai pemalar yang dimulakan secara statik. Walau bagaimanapun, adalah lebih intuitif untuk memulakan dan menamatkan pengembalian sama ada senarai_pemula atau senarai_pemula const, bergantung pada budi bicara pengkompil.
Pertimbangan Lanjut
Cadangan ISO telah dibuat untuk menyediakan sokongan initializer_list untuk jenis bergerak sahaja. Cadangan ini, walaupun masih di peringkat awal, menangani isu yang dibangkitkan di sini.
Atas ialah kandungan terperinci Bolehkah Anda Memindahkan Elemen Daripada std::initializer_list?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!