Rumah > pembangunan bahagian belakang > C++ > Mengapakah Menggunakan Range-Based For Loop pada `std::vector` Menyebabkan Ralat?

Mengapakah Menggunakan Range-Based For Loop pada `std::vector` Menyebabkan Ralat?

Patricia Arquette
Lepaskan: 2024-10-26 03:57:02
asal
913 orang telah melayarinya

Why Does Using a Range-Based For Loop on `std::vector` Cause an Error?

Memahami Julat-untuk-Gelung dan std::vector

Dalam C , berasaskan julat untuk gelung memudahkan lelaran berakhir bekas. Walau bagaimanapun, tingkah laku yang tidak dijangka boleh timbul apabila cuba menggunakan gelung ini dengan jenis bekas tertentu, seperti std::vector.

Pertimbangkan coretan kod berikut:

<code class="cpp">std::vector<int> intVector(10);
for(auto& i : intVector)
    std::cout << i;</code>
Salin selepas log masuk

Kod ini mengulangi koleksi intVector dan mencetak setiap elemen. Walau bagaimanapun, gantikan intVector dengan std::vector boolVector:

<code class="cpp">std::vector<bool> boolVector(10);
for(auto& i : boolVector)
    std::cout << i;</code>
Salin selepas log masuk

Kod yang diubah suai ini mengakibatkan ralat:

error: invalid initialization of non-const reference of type ‘std::_Bit_reference&’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’
Salin selepas log masuk

Mekanisme Asas:

Percanggahan timbul kerana std:: vektor beroperasi secara berbeza daripada jenis vektor lain. Dalam kebanyakan variasi std::vektor, iterator menunjuk kepada rujukan jenis elemen, membenarkan akses terus dan pengubahsuaian melalui auto&. Walau bagaimanapun, ini tidak berlaku untuk std::vector.

std::vector menyimpan nilai boolean dengan cekap dengan membungkusnya ke dalam integer. Akibatnya, iterator mengembalikan objek proksi khas yang melakukan manipulasi bit untuk mendapatkan nilai boolean. Proksi ini ialah rnilai (sementara), yang tidak boleh terikat kepada rujukan lnilai (auto&).

Penyelesaian:

Untuk menyelesaikan masalah ini, gunakan auto&&& dalam julat gelung berasaskan:

<code class="cpp">for(auto&& i : boolVector)
    std::cout << i;</code>
Salin selepas log masuk

Sintaks auto&&& menyemak jenis rujukan lelaran. Jika ia adalah rujukan nilai, ia tetap sama; jika tidak, ia mengikat dan mengekalkan proksi sementara, membenarkan kod untuk dilaksanakan dengan betul.

Atas ialah kandungan terperinci Mengapakah Menggunakan Range-Based For Loop pada `std::vector` Menyebabkan Ralat?. 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