2010-05-29 11 views
8

la siguiente:mapa STL contiene referencias no se compila

std::map<int, ClassA &> test; 

da:

error C2101: '&' on constant 

Aunque la siguiente

std::map<ClassA &, int> test; 

da

error C2528: '_First' : pointer to reference is illegal 

Lo último parece que el mapa no puede contener una referencia para el valor de la clave, ya que necesita instanciar la clase a veces y una referencia no se puede crear una instancia sin un objeto. Pero, ¿por qué el primer caso no funciona?

Respuesta

16

Es ilegal almacenar referencias en un contenedor stl, porque los tipos deben ser copiables y asignables. Las referencias no pueden ser asignadas.

Exactamente qué operación causa el primer error depende de la implementación, pero imagino que está relacionado con la creación de una referencia y no asignarla inmediatamente. El segundo mensaje de error parece estar relacionado con la construcción del índice del mapa.

Si su tipo es pequeño, puede copiarlo en el mapa, o si es grande, considere usar punteros en su lugar, pero recuerde que el contenedor no desasignará los objetos para usted, tendrá que hacerlo explícitamente usted mismo .

This OTRA pregunta podría ser de su interés.

3

§8.3.2 sección 5

No habrá referencias a referencias, no hay matrices de referencias, y no hay punteros a referencias.

Probablemente esté pensando en referencias como punteros divertidos. Ellos no son.

1

No puede almacenar referencias porque no son copiables (y algunas operaciones serán imposibles porque tampoco son construibles por defecto).

Sin embargo, puede emular el comportamiento usando un puntero:

std::map<int, ClassA*> test; 

Es un poco molesto porque este caso es necesario eliminar la referencia dos veces:

std::map<int, ClassA*>::iterator it = test.begin(); 

it->second->foo(); 

pero con un map es mucho menos confuso que con a vector o set (sería (*it)->foo().

Por último, hay algunos aspectos críticos (los de un puntero):

  • Debe asegurarse de que el objeto apuntado permanecerá viva todo el tiempo que desee usar el puntero
  • La inicialización por defecto de un puntero es un valor aleatorio, usando él causa un comportamiento indefinido
  • Cuando el puntero se tira, los restos de objetos (por suerte), pero significa que necesita para que sea obtendrá destruida en un momento
Cuestiones relacionadas