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

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

Linda Hamilton
Linda Hamiltonoriginal
2024-10-27 07:45:31463parcourir

Why Does Using a Range-Based For Loop With std::vector<bool> Provoquer une erreur en C ? 
Provoquer une erreur en C ? " />

Range-for-Loops et std::vector

En C , les boucles for basées sur une plage offrent un moyen pratique de parcourir les éléments d'un conteneur. Cependant, certains comportements peuvent sembler surprenants lorsqu'ils sont utilisés avec des conteneurs de valeurs booléennes.

Le problème

Considérez le code suivant :

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

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

La première boucle parcourt avec succès intVector et imprime les éléments entiers. Cependant, la deuxième boucle entraîne l'erreur suivante :

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}’
for (auto& i : boolVector)

The Reason

Cette erreur se produit car std::vector Au lieu de conserver ses éléments dans des emplacements de mémoire individuels, il regroupe les valeurs booléennes en entiers (32 bits par booléen). En conséquence, ses itérateurs renvoient un objet proxy qui donne accès aux valeurs booléennes individuelles via le masquage de bits.

La solution

Pour parcourir un std::vector, la syntaxe correcte est d'utiliser auto&&, qui se liera à une référence lvalue si elle en est donnée ou maintiendra le proxy temporaire si c'est le cas :

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

En utilisant auto&&, le compilateur se réduira correctement en une référence lvalue s'il reçoit de vraies références de valeur booléenne ou liera et maintiendra en vie les proxys temporaires s'il reçoit des références aux proxys.

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