Maison >développement back-end >C++ >Pourquoi l'utilisation de boucles basées sur une plage avec std :: vector entraîne-t-elle une erreur du compilateur ?

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

Patricia Arquette
Patricia Arquetteoriginal
2024-10-26 06:05:31675parcourir

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>

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>

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>

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!

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