Comprendre la plage pour les boucles et std::vector
En C, les boucles for basées sur la plage simplifient l'itération sur conteneurs. Cependant, un comportement inattendu peut survenir lors de la tentative d'utilisation de ces boucles avec certains types de conteneurs, tels que std::vector
Considérez l'extrait de code suivant :
<code class="cpp">std::vector<int> intVector(10); for(auto& i : intVector) std::cout << i;</code>
Ce code parcourt la collection intVector et imprime chaque élément. Cependant, remplacez intVector par un std::vector
<code class="cpp">std::vector<bool> boolVector(10); for(auto& i : boolVector) std::cout << i;</code>
Ce code modifié entraîne une erreur :
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}’
Mécanisme sous-jacent :
L'écart se produit car std : vecteur
std::vector
Solution :
Pour résoudre ce problème, utilisez auto&&& dans la plage -based loop :
<code class="cpp">for(auto&& i : boolVector) std::cout << i;</code>
La syntaxe auto&&& vérifie le type de la référence de l'itérateur. S'il s'agit d'une référence lvalue, elle reste la même ; sinon, il se lie au proxy temporaire et le préserve, permettant au code de s'exécuter correctement.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!