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:
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.