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

Pourquoi l'utilisation de boucles basées sur une plage avec std :: vector entraîne-t-elle une erreur du compilateur ?

Patricia Arquette
Libérer: 2024-10-26 06:05:31
original
608 Les gens l'ont consulté

Why Does Using Range-Based Loops with std::vector Result in a Compiler Error?

Range-for-Loops et std::vector

En C , les boucles basées sur des plages se sont répandues en raison de leur simplicité et de leur lisibilité. Ils parcourent de manière itérative des éléments de séquences ou des objets conteneurs.

Cependant, une curieuse incohérence survient lorsque l'on tente d'utiliser des boucles basées sur une plage avec std::vector. Alors que le code suivant fonctionnera comme prévu :

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

utilisation de range-for-loops avec std::vector entraîne une erreur du compilateur :

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

Le message d'erreur "initialisation invalide d'une référence non const de type 'std::_Bit_reference&' à partir d'une rvalue de type 'std::_Bit_iterator::reference {alias std ::_Bit_reference}'" indique qu'une référence non const est initialisée avec une rvalue.

Comprendre le problème

La raison de cet écart réside dans la différence implémentation de std::vector. Contrairement à std::vector, qui stocke chaque entier séparément, std::vector utilise un compactage de bits pour conserver la mémoire. Par conséquent, ses itérateurs n'accèdent pas directement aux bools individuels mais renvoient à la place des références à std::_Bit_reference, qui sert de proxy pour accéder aux bits sous-jacents.

Solution : Utiliser auto&&&

Pour résoudre ce problème, il est nécessaire d'utiliser auto&&& au lieu de auto&. Cet idiome réduira correctement la référence à une référence lvalue lorsqu'elle est fournie avec une lvalue (comme intVector dans le premier exemple), tout en liant et en maintenant simultanément le temporaire vivant si un proxy est fourni (comme dans le cas de boolVector).

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

En employant cette technique, vous pouvez efficacement parcourir std::vector et accédez à ses éléments à l'aide de boucles basées sur la plage.

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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!