error: initialisation non valide de la référence non-const de type ‘bool &’ à partir d’une rvalue de type ‘std :: vector :: reference {aka std :: _ Bit_reference}’

Pourquoi ai-je le message d’erreur suivant: initialisation non valide d’une référence non-const de type ‘bool &’ à partir d’une rvalue de type ‘std :: vector :: reference {aka std :: _ bit_reference}’?

vector<vector> vis; bool& visited(int x, int y) { return vis[x][y]; //error } 

Pour autant que je sache, l’opérateur [] dans le vecteur renvoie la référence, ce devrait donc être une valeur, mais cela ne fonctionne pas. Que dois-je faire pour que cela fonctionne?

C’est parce que std::vector< bool > n’est pas ce à quoi il ressemble.

Il existe une spécialisation pour std::vector de type bool : elle optimise l’espace et utilise un seul bit pour chaque élément.

Vous pouvez essayer d’utiliser uint8_t ou quelque chose du genre si vous avez besoin de cette fonctionnalité. Ou bien retournez bool , pas bool& .

La référence, renvoyée par l’ operator[] n’est pas une référence standard, mais une classe proxy, ce qui complique les choses ici.

Il y a beaucoup de questions similaires à ce sujet ici:

  • opérateur | = sur std :: vector
  • Pourquoi le vecteur :: reference ne renvoie pas de référence à bool?
  • L’utilisation d’objects std :: vector en C ++ est-elle acceptable ou dois-je utiliser une alternative?

Et d’autres. En savoir plus sur la spécialisation std::vector< bool > .

Normalement, ce que vous supposez être le cas, pour littéralement tout vector sauf le vector . La norme C ++ 98 d’origine spécifiait cela comme un vecteur compacté, de sorte qu’il est impossible de faire référence à des éléments individuels.

Depuis lors, cette erreur a été reconnue, mais sa compatibilité avec les versions antérieures signifie qu’elle ne peut plus être modifiée maintenant.