2015-05-21 31 views
5

Perché ottengo l'errore: inizializzazione non valida di non -Con riferimento di tipo 'bool &' da un valore rval di tipo 'std :: vector :: reference {aka std :: _ Bit_reference}'?errore: inizializzazione non valida di riferimento non const di tipo 'bool &' da un valore di tipo 'std :: vector <bool> :: reference {aka std :: _ Bit_reference}'

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

Per quanto ne so operatore [] nel vettore restituisce riferimento, quindi dovrebbe essere un lvalue, ma non funziona. Cosa dovrei fare per farlo funzionare?

+0

Hai dimenticato di cercare i tipi che stai utilizzando nella documentazione? –

risposta

10

Questo perché std::vector<bool> non è quello che sembra.

C'è un specializzazione per std::vector con tipo bool - è spazio ottimizzato e utilizza un singolo bit per ogni elemento.

È possibile provare a utilizzare uint8_t o qualcosa di simile, se è necessaria questa funzionalità. O semplicemente restituire bool, non bool&.

Il riferimento, restituito da operator[] non è un riferimento standard, ma una classe proxy, che complica le cose qui.

Ci sono un sacco di domande simili su questo qui:

e altri. Maggiori informazioni sulla specializzazione std::vector<bool>.

4

Normalmente, quello che hai assunto è il caso, per letteralmente qualsiasi vector<T> tranne vector<bool>. Lo standard C++ 98 originale lo ha specificato come un vettore bit-packed e quindi i riferimenti ai singoli elementi sono impossibili.

Da allora è stato riconosciuto come un errore sconveniente, ma la compatibilità con le versioni precedenti significa che non può essere modificato ora.