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
Barbara Streisandoriginal
2024-10-27 05:28:03650parcourir

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>

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>

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>

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