Heim >Backend-Entwicklung >C++ >Warum führt die Verwendung bereichsbasierter Schleifen mit std::vector zu einem Compilerfehler?

Warum führt die Verwendung bereichsbasierter Schleifen mit std::vector zu einem Compilerfehler?

Patricia Arquette
Patricia ArquetteOriginal
2024-10-26 06:05:31672Durchsuche

Why Does Using Range-Based Loops with std::vector Result in a Compiler Error?

Range-for-Loops und std::vector

In C sind bereichsbasierte Schleifen aufgrund ihrer Einfachheit und Lesbarkeit weit verbreitet. Sie iterativ über Elemente von Sequenzen oder Containerobjekten.

Allerdings entsteht eine merkwürdige Inkonsistenz, wenn versucht wird, bereichsbasierte Schleifen mit std::vector zu verwenden. Während der folgende Code wie erwartet funktioniert:

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

using range-for-loops with std::vector führt zu einem Compilerfehler:

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

Die Fehlermeldung „ungültige Initialisierung einer nicht konstanten Referenz vom Typ ‚std::_Bit_reference&‘ aus einem R-Wert vom Typ ‚std::_Bit_iterator::reference {aka std ::_Bit_reference}'" zeigt an, dass eine nicht konstante Referenz mit einem R-Wert initialisiert wird.

Verstehen des Problems

Der Grund für diese Diskrepanz liegt in der Unterscheidung Implementierung von std::vector. Im Gegensatz zu std::vector, das jede Ganzzahl separat speichert, ist std::vector Verwendet Bit-Packung, um Speicher zu sparen. Folglich greifen seine Iteratoren nicht direkt auf einzelne Bools zu, sondern geben stattdessen Verweise auf std::_Bit_reference zurück, das als Proxy für den Zugriff auf die zugrunde liegenden Bits dient.

Lösung: Verwendung von auto&&&

Um dieses Problem zu beheben, ist es notwendig, auto&&& anstelle von auto& zu verwenden. Diese Redewendung reduziert den Verweis auf einen L-Wert-Verweis korrekt, wenn er mit einem L-Wert versehen wird (z. B. intVector im ersten Beispiel), während gleichzeitig das Temporär gebunden und am Leben gehalten wird, wenn ein Proxy bereitgestellt wird (wie im Fall von boolVector).

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

Mit dieser Technik können Sie effektiv über std::vector iterieren. und greifen Sie über bereichsbasierte Schleifen auf seine Elemente zu.

Das obige ist der detaillierte Inhalt vonWarum führt die Verwendung bereichsbasierter Schleifen mit std::vector zu einem Compilerfehler?. 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