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

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

Linda Hamilton
Libérer: 2024-10-27 07:45:31
original
539 Les gens l'ont consulté

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

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

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

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!

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