Rumah > pembangunan bahagian belakang > C++ > Bolehkah Anda Memindahkan Elemen Daripada std::initializer_list?

Bolehkah Anda Memindahkan Elemen Daripada std::initializer_list?

Patricia Arquette
Lepaskan: 2024-12-26 00:49:09
asal
1033 orang telah melayarinya

Can You Move Elements Out of a std::initializer_list?

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? Mari kita siasat perkara ini dengan lebih lanjut.

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?
    }
}
Salin selepas log masuk

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!

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