Range-for-Loops und std::vector
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
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
<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
std::vector
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!