2015-05-21 12 views
5

Warum bekomme ich den Fehler: ungültige Initialisierung von nicht -const Referenz des Typs 'bool &' aus einem rvalue des Typs 'std :: vector :: reference {aka std :: _ Bit_reference}'?Fehler: ungültige Initialisierung von nicht-const Referenz des Typs 'Bool &' von einem Rvalue des Typs 'Std :: Vektor <bool> :: Referenz {aka Std :: _ Bit_reference}'

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

Soweit ich weiß Operator [] in Vektor zurückgibt Bezug, so ist es ein L-Wert sein soll, aber es funktioniert nicht. Was soll ich tun, damit es funktioniert?

+0

Haben Sie vergessen, die in der Dokumentation verwendeten Typen nachzuschlagen? –

Antwort

10

Das liegt daran, std::vector<bool> ist nicht, wie es aussieht.

Es gibt eine Spezialisierung für std::vector mit Typ bool - es Raum ist optimiert und verwendet ein einzelnes Bit für jedes Element.

Sie können versuchen, uint8_t oder etwas ähnliches zu verwenden, wenn Sie diese Funktionalität benötigen. Oder geben Sie einfach bool, nicht bool&.

Die Referenz, die von operator[] zurückgegeben wird, ist keine Standardreferenz, sondern eine Proxy-Klasse, die die Dinge hier kompliziert.

Es gibt viele ähnliche Fragen zu diesem Thema hier:

und andere. Lesen Sie mehr über std::vector<bool> Spezialisierung.

4

Normalerweise, was Sie angenommen haben, ist der Fall, für buchstäblich alle vector<T> außer vector<bool>. Der ursprüngliche C++ 98-Standard spezifizierte dies als einen bitgepackten Vektor, und so sind Verweise auf die einzelnen Elemente unmöglich.

Dies wurde seither als ein unbequemer Fehler erkannt, aber Rückwärtskompatibilität bedeutet, dass es jetzt nicht geändert werden kann.

Verwandte Themen