Heim >Backend-Entwicklung >C++ >Warum verursacht die Verwendung einer bereichsbasierten For-Schleife für „std::vector' einen Fehler?

Warum verursacht die Verwendung einer bereichsbasierten For-Schleife für „std::vector' einen Fehler?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 03:57:02915Durchsuche

Why Does Using a Range-Based For Loop on `std::vector` Cause an Error?

Range-for-Loops und std::vector verstehen

In C vereinfachen bereichsbasierte for-Schleifen die Iteration Behälter. Allerdings kann es zu unerwartetem Verhalten kommen, wenn versucht wird, diese Schleifen mit bestimmten Containertypen wie std::vector zu verwenden.

Beachten Sie den folgenden Codeausschnitt:

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

Dieser Code iteriert über die intVector-Sammlung und gibt jedes Element aus. Ersetzen Sie jedoch intVector durch ein std::vector boolVector:

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

Dieser geänderte Code führt zu einem Fehler:

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}’

Zugrundeliegender Mechanismus:

Die Diskrepanz entsteht, weil std:: Vektor funktioniert anders als andere Vektortypen. In den meisten std::vector-Varianten verweisen Iteratoren auf Referenzen des Elementtyps und ermöglichen so den direkten Zugriff und die Änderung über auto&. Dies ist jedoch bei std::vector nicht der Fall.

std::vector speichert boolesche Werte effizient, indem es sie in Ganzzahlen packt. Infolgedessen geben Iteratoren ein spezielles Proxy-Objekt zurück, das eine Bitmanipulation durchführt, um den booleschen Wert abzurufen. Dieser Proxy ist ein R-Wert (temporär), der nicht an eine L-Wert-Referenz (auto&) gebunden werden kann.

Lösung:

Um dieses Problem zu beheben, verwenden Sie auto&&& im Bereich -basierte Schleife:

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

Die Auto&&&-Syntax prüft den Typ der Iteratorreferenz. Wenn es sich um eine L-Wert-Referenz handelt, bleibt sie gleich; Andernfalls bindet es sich an den temporären Proxy und behält diesen bei, sodass der Code korrekt ausgeführt werden kann.

Das obige ist der detaillierte Inhalt vonWarum verursacht die Verwendung einer bereichsbasierten For-Schleife für „std::vector' einen Fehler?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn