Maison > développement back-end > C++ > Pourquoi ne puis-je pas utiliser « auto& » avec « std :: vector » dans une plage pour boucle ?

Pourquoi ne puis-je pas utiliser « auto& » avec « std :: vector » dans une plage pour boucle ?

Barbara Streisand
Libérer: 2024-10-27 05:28:03
original
666 Les gens l'ont consulté

Why Can't I Use `auto&` with `std::vector` in a Range-for-Loop?

Range-for-Loops avec std::vector

En C, les range-for-loops sont couramment utilisées pour itérer sur les conteneurs STL. Cependant, on peut rencontrer une erreur en essayant d'utiliser cette approche avec un 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 fonctionne parce que std : :vecteur est un conteneur avec des itérateurs qui font référence à un int&. Cela signifie que nous pouvons lier la valeur déréférencée de l'itérateur à notre propre référence lvalue auto&.

Cependant, si nous essayons d'effectuer la même opération avec un std::vector, nous rencontrerons une erreur similaire à :

<code class="cpp">std::vector<bool> boolVector(10);
for(auto& i : boolVector)
    std::cout << i;</code>
Copier après la connexion

C'est parce que std::vector n'est pas un conteneur au sens traditionnel mais plutôt un ensemble de bits. Il stocke les valeurs booléennes de manière compressée, en utilisant des entiers pour représenter plusieurs booléens. Par conséquent, ses itérateurs renvoient un objet Proxy au lieu d'un bool&.

Les proxys sont des objets temporaires qui ne peuvent pas être liés à une référence lvalue. C'est pourquoi nous ne pouvons pas utiliser auto& dans la plage pour boucle ci-dessus. Au lieu de cela, nous devons utiliser auto&&, qui se liera correctement à une référence lvalue si on lui en donne une ou maintiendra le proxy temporaire en vie s'il reçoit un proxy. Voici le code corrigé :

<code class="cpp">for(auto&& i : boolVector)
    std::cout << i;</code>
Copier après la connexion

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