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

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

Patricia Arquette
Patricia Arquetteasal
2024-10-26 03:57:02823semak imbas

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>

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>

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}’

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>

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!

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