Rumah > pembangunan bahagian belakang > C++ > Mengapakah Range-Based For Loops Berkelakuan Berbeza dengan `std::vector`?

Mengapakah Range-Based For Loops Berkelakuan Berbeza dengan `std::vector`?

DDD
Lepaskan: 2024-10-30 04:06:02
asal
1094 orang telah melayarinya

Why Do Range-Based For Loops Behave Differently with `std::vector`?

Julat-untuk-Gelung dan std::vector

Apabila menggunakan berasaskan julat untuk gelung dengan bekas perpustakaan standard, jenis data iterator sering menentukan jenis data pembolehubah pembilang. Dalam kes std::vector, bagaimanapun, gelagat unik timbul disebabkan oleh mekanisme storan asasnya.

Dalam contoh pertama:

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

Std::vector< ;int> mengandungi integer, jadi jenis iterator ialah std::vector::iterator. Peulang ini menolak rujukan kepada T&, yang dalam kes ini ialah int&, menjadikan pembolehubah pembilang jenis int&.

Sekarang, mari kita pertimbangkan contoh kedua:

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

Di sini, std: :vektor mengandungi bool, yang disimpan dalam format padat integer. Jenis iterator ialah std::vector::iterator, yang menolak rujukan kepada std::vector::reference, juga dikenali sebagai std::_Bit_reference. Jenis rujukan ini ialah rnilai (sementara) dan tidak boleh terikat kepada rujukan bukan const. Ini mengakibatkan ralat penyusunan:

<code class="text">invalid initialization of non-const reference of type ‘std::_Bit_reference&amp;’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’</code>
Salin selepas log masuk

Penyelesaian adalah dengan menggunakan auto&&, yang akan mengikat rujukan nilai jika ia rujukan nilai, atau cipta salinan sementara nilai jika ia sementara:

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

Dengan pengubahsuaian ini, kod akan mengeluarkan kandungan boolVector seperti yang dijangkakan.

Atas ialah kandungan terperinci Mengapakah Range-Based For Loops Berkelakuan Berbeza dengan `std::vector`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan