Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapa Menggunakan Gelung Berasaskan Julat dengan std::vector Menghasilkan Ralat Pengkompil?

Mengapa Menggunakan Gelung Berasaskan Julat dengan std::vector Menghasilkan Ralat Pengkompil?

Patricia Arquette
Patricia Arquetteasal
2024-10-26 06:05:31609semak imbas

Why Does Using Range-Based Loops with std::vector Result in a Compiler Error?

Julat-untuk-Gelung dan std::vector

Dalam C , gelung berasaskan julat telah meluas kerana kesederhanaan dan kebolehbacaannya. Mereka berulang kali ke atas unsur-unsur jujukan atau objek bekas.

Walau bagaimanapun, ketidakkonsistenan yang ingin tahu timbul apabila cuba menggunakan gelung berasaskan julat dengan std::vector. Manakala kod berikut akan berfungsi seperti yang dijangkakan:

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

menggunakan julat-untuk-gelung dengan std::vector mengakibatkan ralat pengkompil:

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

Mesej ralat "pengamulaan tidak sah rujukan bukan const jenis 'std::_Bit_reference&' daripada nilai r jenis 'std::_Bit_iterator::reference {aka std ::_Bit_reference}'" menunjukkan bahawa rujukan bukan const sedang dimulakan dengan nilai r.

Memahami Isu

Punca percanggahan ini terletak pada perbezaan yang berbeza pelaksanaan std::vector. Tidak seperti std::vector, yang menyimpan setiap integer secara berasingan, std::vector menggunakan pembungkusan bit untuk menjimatkan ingatan. Akibatnya, iteratornya tidak mengakses bool individu secara langsung sebaliknya mengembalikan rujukan kepada std::_Bit_reference, yang berfungsi sebagai proksi untuk mengakses bit asas.

Penyelesaian: Menggunakan auto&&&

Untuk menyelesaikan isu ini, anda perlu menggunakan auto&&& bukannya auto&. Simpulan bahasa ini akan meruntuhkan rujukan kepada rujukan nilai dengan betul apabila disediakan dengan nilai (seperti intVector dalam contoh pertama), sambil mengikat dan mengekalkan sementara tetap hidup jika proksi disediakan (seperti dalam kes boolVector).

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

Dengan menggunakan teknik ini, anda boleh mengulang std::vector dan akses elemennya menggunakan gelung berasaskan julat.

Atas ialah kandungan terperinci Mengapa Menggunakan Gelung Berasaskan Julat dengan std::vector Menghasilkan Ralat Pengkompil?. 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