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 ?
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
<code class="cpp">std::vector<int> intVector(10); for(auto& i : intVector) std::cout << i;</code>
utilisation de range-for-loops avec std::vector
<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
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
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!