2011-11-30 12 views
6

Recibo la advertencia solo al acceder a la dirección del elemento en el vector de bool. Para el vector de otros tipos de datos como int, no aparece ninguna advertencia.tomando la dirección temporal mientras se accede a la dirección de un elemento en el vector <bool>

por ejemplo

vector<bool> boolVect; 
boolVect.push_back(false); 
if (boolVect.size() > 0) { 
    cout << &boolVect[0] << endl; 
} 

consigo advertencia "tomar la dirección del temporal" por la declaración "cout < < & boolVect [0] < < endl;"
¿Puede alguien aclarar?

+2

Trate de usar '' deque '' en su lugar. Debe comportarse como lo espera. – fschoenm

Respuesta

13

std::vector<bool> está roto (vea por ejemplo http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=98 o Alternative to vector<bool>). Es una especialización de std::vector<T>, pero los elementos individuales se almacenan como bits empaquetados. Por lo tanto, no puede tomar la dirección de un elemento individual. Por lo tanto, es realmente molesto.

+2

Sí, _broken_ es el término correcto. –

+0

Tengo una clase de plantilla. Utiliza "vector vect" y la dirección de acceso (& vect [i]). Recibo una advertencia de tiempo de compilación aquí para T = bool. ¿Cómo puedo deshacerme de esta advertencia si para T = bool no se accede a la dirección? – Rahul

+0

@Rahul (Mucho tiempo desde que publicaste, pero aún así ...) ¿Puedes hacer una especialización de plantilla para bool? Podría proporcionar una implementación diferente para bool que evite tomar la dirección de un elemento. – Daryn

3

A vector<bool> es una plantilla de especialización de la norma vector. En una implementación normal ahorra espacio, que cada bool solo toma un bit. Para su comodidad, obtiene un objeto temporal como referencia para su único bit que de otra manera no podría abordar.

Cuestiones relacionadas