Heim >Backend-Entwicklung >C++ >Warum führt die Verwendung bereichsbasierter Schleifen mit std::vector zu einem Compilerfehler?
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
<code class="cpp">std::vector<int> intVector(10); for(auto& i : intVector) std::cout << i;</code>
using range-for-loops with std::vector
<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
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
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!