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
<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
std::vector
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!