2012-04-17 13 views
5
for (Something something : setOfSomething)   // OK 
for (Something const& something : setOfSomething) // OK 
for (Something& something : setOfSomething)   // ERROR 

error: invalid initialization of reference of type 'Something&' 
from expression of type 'const Something' 

¿Desde cuándo el iterador devuelve const Something? Debería devolver Something& o Something const&. Y dado que el bucle 'for' basado en el rango se interpreta como that, no tengo una explicación plausible de lo que está sucediendo.Adquirir la referencia a un elemento de un contenedor STL en un ciclo 'for' basado en el rango C++ 11

Edit: Estoy hablando de unordered_set en lugar de set, disculpa esta confusión.

Respuesta

13

No se pueden mutar los miembros de un set porque eso podría violar las invariantes set. Entonces, el compilador lo restringe a obtener referencias o copias de const.

+0

Qué tipo de invariantes se pueden romper si modifico MI objeto. La ubicación y el tamaño de la memoria que ocupa permanece intacta, y estas dos cosas son las únicas que se supone que 'set' debe controlar. Además, ¿qué pasa si tengo mi propio contenedor? ¿Por qué el compilador impondría este tipo de restricción en mis contenedores? Para ser honesto, parece un truco sucio. –

+1

El orden de los objetos en el 'conjunto 'podría cambiarse si actualizas partes de tu objeto en comparación con la comparación del' conjunto'. Si este problema está sucediendo con un contenedor que no sea 'std :: set' o cualquiera de sus parientes (multi, desordenado, etc.), ¿podría editar los detalles y más código en su pregunta? –

+0

Es mi problema entonces, entonces soy un idiota, pero no es asunto del compilador. Además, aún puedo modificarlo dentro de un bucle de iterador antiguo. –

Cuestiones relacionadas