Rumah >pembangunan bahagian belakang >C++ >Bolehkah Kita Memindahkan Elemen dengan Selamat daripada `std::initializer_list` dalam C ?

Bolehkah Kita Memindahkan Elemen dengan Selamat daripada `std::initializer_list` dalam C ?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-19 15:03:15331semak imbas

Can We Safely Move Elements from a `std::initializer_list` in C  ?

Elemen Bergerak daripada std::initializer_list

Dalam C , senarai pemula, ditandakan sebagai std::initializer_list, mengemukakan soalan berkenaan pergerakannya elemen. Bolehkah kita mengekstrak dan memindahkan elemen dengan selamat daripada senarai sedemikian? Mari kita siasat isu ini.

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 mempamerkan ciri unik yang membezakannya daripada bekas biasa. Elemennya berada dalam penimbal sementara dan tidak tertakluk kepada nilai semantik yang sama seperti bekas standard. Ini menimbulkan keraguan tentang potensi pergerakan yang berjaya.

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 return const T *, yang menghasilkan rujukan rvalue tidak berubah yang dilambangkan sebagai T const &&.

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!

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