Heim  >  Artikel  >  Backend-Entwicklung  >  Warum verhalten sich bereichsbasierte For-Schleifen mit „std::vector“ anders?

Warum verhalten sich bereichsbasierte For-Schleifen mit „std::vector“ anders?

DDD
DDDOriginal
2024-10-30 04:06:02948Durchsuche

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

Range-for-Loops und std::vector

Bei Verwendung bereichsbasierter for-Schleifen mit Standardbibliothekscontainern wird die Der Datentyp des Iterators bestimmt häufig den Datentyp der Zählervariablen. Im Fall von std::vector entsteht jedoch aufgrund des zugrunde liegenden Speichermechanismus ein einzigartiges Verhalten.

Im ersten Beispiel:

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

Der std::vector< ;int> enthält Ganzzahlen, daher ist der Iteratortyp ein std::vector::iterator. Dieser Iterator dereferenziert auf ein T&, das in diesem Fall int& ist, wodurch die Zählervariable vom Typ int& wird.

Betrachten wir nun das zweite Beispiel:

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

Hier ist der std: :vector enthält Bools, die in einem ganzzahlig gepackten Format gespeichert sind. Der Iteratortyp ist std::vector::iterator, der auf eine std::vector::reference dereferenziert, auch bekannt als std::_Bit_reference. Dieser Referenztyp ist ein R-Wert (temporär) und kann nicht an eine nicht konstante Referenz gebunden werden. Dies führt zu dem Kompilierungsfehler:

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

Die Lösung besteht darin, auto&& zu verwenden, das an eine L-Wert-Referenz bindet, wenn es sich um eine L-Wert-Referenz handelt, oder eine temporäre Kopie des R-Werts zu erstellen, wenn es sich um einen temporären Wert handelt:

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

Mit dieser Änderung gibt der Code den Inhalt von boolVector wie erwartet aus.

Das obige ist der detaillierte Inhalt vonWarum verhalten sich bereichsbasierte For-Schleifen mit „std::vector“ anders?. 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