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
960 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!

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