Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Saya Tidak Boleh Menggunakan `auto&` dengan `std::vector` dalam Julat-untuk-Gelung?

Mengapakah Saya Tidak Boleh Menggunakan `auto&` dengan `std::vector` dalam Julat-untuk-Gelung?

Barbara Streisand
Barbara Streisandasal
2024-10-27 05:28:03546semak imbas

Why Can't I Use `auto&` with `std::vector` in a Range-for-Loop?

Julat-untuk-Gelung dengan std::vector

Dalam C , julat-untuk-gelung biasanya digunakan untuk mengulang atas bekas STL. Walau bagaimanapun, seseorang mungkin menghadapi ralat semasa cuba menggunakan pendekatan ini dengan std::vector.

Pertimbangkan coretan kod berikut:

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

Kod ini berfungsi kerana std: :vektor ialah bekas dengan iterator yang tidak merujuk kepada int&. Ini bermakna kita boleh mengikat nilai penyahrujukan lelaran kepada auto rujukan lnilai kita sendiri&.

Namun, jika kita cuba melakukan operasi yang sama dengan std::vector, kita akan menghadapi ralat serupa dengan:

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

Ini kerana std::vector bukan bekas dalam erti kata tradisional tetapi lebih kepada bitset. Ia menyimpan nilai boolean dalam cara yang padat, menggunakan integer untuk mewakili berbilang boolean. Akibatnya, iteratornya mengembalikan objek Proksi dan bukannya bool&.

Proksi ialah objek sementara yang tidak boleh terikat pada rujukan lnilai. Inilah sebabnya kami tidak boleh menggunakan auto& dalam julat-untuk-gelung di atas. Sebaliknya, kita perlu menggunakan auto&&, yang akan mengikat dengan betul rujukan nilai jika diberikan atau mengekalkan Proksi sementara hidup jika ia diberi proksi. Berikut ialah kod yang diperbetulkan:

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

Atas ialah kandungan terperinci Mengapakah Saya Tidak Boleh Menggunakan `auto&` dengan `std::vector` dalam Julat-untuk-Gelung?. 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