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

DDD
Lepaskan: 2024-10-30 04:06:02
asal
950 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!

sumber:php.cn
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
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!