Rumah >pembangunan bahagian belakang >C++ >Bolehkah saya Pindahkan Elemen daripada `std::initializer_list`?
Bolehkah saya Pindahkan Elemen dari std::initializer_list?
Apabila menggunakan std::initializer_list, adalah logik untuk mempercayai bahawa seseorang boleh memindahkan elemen daripadanya. Walau bagaimanapun, kod berikut menunjukkan sebaliknya:
#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)); // Safe? } }
Bertentangan dengan jangkaan, cuba mengalihkan elemen keluar daripada std::initializer_list menyebabkan salinan sebaliknya. Ini timbul kerana sifat unik std::intializer_list, yang memerlukan pengendalian pengkompil khas dan tidak mempunyai nilai semantik bekas biasa.
Isunya terletak pada jenis pemulangan begin() dan end() untuk std ::initializer_list, iaitu const T . Oleh itu, ungkapan 'std::move(it)' menghasilkan rujukan rnilai tidak berubah (T const &&&), yang tidak boleh dialihkan dengan berkesan. Ia hanya mengikat pada parameter fungsi jenis T const & kerana rvalues mengikat kepada rujukan const lvalue, menghasilkan semantik salinan.
Tingkah laku ini mungkin kelihatan berlawanan dengan intuitif, tetapi ia membenarkan pengkompil berpotensi menjadikan initializer_list sebagai statik- pemalar yang dimulakan. Namun begitu, ia memperkenalkan ketidakkonsistenan yang menyebabkan pengguna tidak pasti sama ada hasil begin() dan end() adalah const atau boleh ubah.
Atas ialah kandungan terperinci Bolehkah saya Pindahkan Elemen daripada `std::initializer_list`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!