Maison > développement back-end > C++ > le corps du texte

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

Patricia Arquette
Libérer: 2024-10-26 03:57:02
original
905 Les gens l'ont consulté

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>
Copier après la connexion

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>
Copier après la connexion

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}’
Copier après la connexion

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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal