Pindahkan Semantik dan senarai_pemula
Dalam C , senarai_pemula ialah jujukan sementara nilai jenis T. Ia biasanya digunakan untuk memulakan tatasusunan dan bekas lain. Walau bagaimanapun, persoalan timbul: bolehkah elemen dialih keluar daripada senarai_pemula?
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)); // Allowable?
}
}
Salin selepas log masuk
Jawapan:
Malangnya, mengalihkan elemen keluar daripada senarai_pemula tidak akan berkelakuan seperti yang dimaksudkan. Ia masih akan menghasilkan salinan, walaupun jangkaan bahawa initializer_list akan menyimpan pelbagai sementara sehingga ia dialihkan.
Sisihan ini berpunca daripada fakta bahawa initializer_list::begin() dan initializer_list ::end() return const T *. Hasil perpindahan dalam kod yang disediakan menghasilkan T const & &&, yang mewakili rujukan rnilai tidak berubah. Ungkapan sedemikian tidak boleh dialihkan. Ia mengikat kepada parameter fungsi jenis T const & kerana rvalues mengikat kepada rujukan const lvalue, yang membawa kepada pemeliharaan semantik salinan.
Sebab di sebalik pengehadan ini mungkin untuk membenarkan pengkompil memulakan initializer_list atau const initializer_list, dengan itu menghapuskan kesamaran bagi pengguna berkenaan sifat const atau boleh ubah bagi hasil begin() dan end().
Walau bagaimanapun, cadangan sambungan kepada standard C telah dikemukakan untuk menangani had ini dan membenarkan initializer_list untuk menyokong jenis bergerak sahaja. Walaupun ia masih dalam peringkat awal pembangunannya, ia mencadangkan penerokaan lanjut dan penggunaan ciri ini pada masa hadapan.
Atas ialah kandungan terperinci Bolehkah Elemen Dialihkan daripada C `initializer_list`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!