Maison  >  Article  >  développement back-end  >  Pourquoi l'utilisation d'une boucle For basée sur une plage sur « std :: vector » provoque-t-elle une erreur ?

Pourquoi l'utilisation d'une boucle For basée sur une plage sur « std :: vector » provoque-t-elle une erreur ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-26 03:57:02823parcourir

Why Does Using a Range-Based For Loop on `std::vector` Cause an Error?

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

<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 fonctionne différemment des autres types de vecteurs. Dans la plupart des variantes de std :: vector, les itérateurs pointent vers des références du type d'élément, permettant un accès direct et une modification via auto&. Cependant, ce n'est pas le cas pour std::vector.

std::vector stocke efficacement les valeurs booléennes en les regroupant en nombres entiers. En conséquence, les itérateurs renvoient un objet proxy spécial qui effectue une manipulation de bits pour récupérer la valeur booléenne. Ce proxy est une rvalue (temporaire), qui ne peut pas être liée à une référence lvalue (auto&).

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn