Rumah > pembangunan bahagian belakang > C++ > Bolehkah Elemen Dialihkan daripada C `initializer_list`?

Bolehkah Elemen Dialihkan daripada C `initializer_list`?

Barbara Streisand
Lepaskan: 2024-12-18 17:14:14
asal
875 orang telah melayarinya

Can Elements Be Moved from a C   `initializer_list`?

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan