Maison >développement back-end >C++ >Pourquoi les boucles For basées sur une plage se comportent-elles différemment avec « std :: vector » ?

Pourquoi les boucles For basées sur une plage se comportent-elles différemment avec « std :: vector » ?

DDD
DDDoriginal
2024-10-30 04:06:021065parcourir

Why Do Range-Based For Loops Behave Differently with `std::vector`?

Range-for-Loops et std::vector

Lors de l'utilisation de boucles for basées sur une plage avec des conteneurs de bibliothèque standard, le Le type de données de l'itérateur dicte souvent le type de données de la variable du compteur. Dans le cas de std::vector, cependant, un comportement unique apparaît en raison de son mécanisme de stockage sous-jacent.

Dans le premier exemple :

<code class="cpp">std::vector<int> intVector(10);
for (auto& i : intVector)
    std::cout << i;

Le std::vector< ;int> contient des entiers, donc le type d'itérateur est un std::vector::iterator. Cet itérateur fait référence à un T&, qui dans ce cas est int&, rendant la variable compteur de type int&.

Maintenant, considérons le deuxième exemple :

<code class="cpp">std::vector<bool> boolVector(10);
for (auto& i : boolVector)
    std::cout << i;</code>

Ici, le std : :vecteur contient des bools, qui sont stockés dans un format entier. Le type d'itérateur est std::vector::iterator, qui déréférence à un std::vector::reference, également connu sous le nom de std::_Bit_reference. Ce type de référence est une rvalue (temporaire) et ne peut pas être lié à une référence non const. Cela entraîne l'erreur de compilation :

<code class="text">invalid initialization of non-const reference of type ‘std::_Bit_reference&amp;’ from an rvalue of type ‘std::_Bit_iterator::reference {aka std::_Bit_reference}’</code>

La solution consiste à utiliser auto&&, qui se liera à une référence lvalue s'il s'agit d'une référence lvalue, ou créera une copie temporaire de la rvalue s'il s'agit d'une référence temporaire :

<code class="cpp">for (auto&& i : boolVector)
    std::cout << i;</code>

Avec cette modification, le code affichera le contenu de boolVector comme prévu.

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