2010-05-29 5 views
8

qui suit:carte STL contenant des références ne compile pas

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

donne:

error C2101: '&' on constant 

Alors que les éléments suivants

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

donne

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

Ce dernier semble comme carte ne peut pas contenir une référence pour la valeur de clé, car il a besoin d'instancier la classe parfois et une référence ne peut pas être instanciée sans un objet. Mais pourquoi le premier cas ne fonctionne pas?

Répondre

16

Il est illégal de stocker des références dans un conteneur stl, car les types doivent pouvoir être copiés et assignables. Les références ne peuvent pas être attribuées.

Le fonctionnement exact de la première erreur est fonction de l'implémentation, mais l'image est liée à la création d'une référence et non à l'affectation immédiate. Le deuxième message d'erreur semble être lié à la construction de l'index de la carte.

Si votre type est petit, vous pouvez le copier dans la carte, ou s'il est grand, pensez à utiliser des pointeurs à la place, mais souvenez-vous que le conteneur ne vous libérera pas les objets, vous devrez le faire explicitement .

This Cette question pourrait vous intéresser.

3

§8.3.2 section 5

Il n'y aura pas de références à des références, pas de tableaux de références, et pas de pointeurs vers des références.

Vous pensez probablement à des références comme des pointeurs amusants. Ils ne sont pas.

1

Vous ne pouvez pas stocker de références car elles ne sont pas copiables (et certaines opérations seront impossibles car elles ne sont pas constructibles par défaut non plus).

Vous pouvez cependant imiter le comportement à l'aide d'un pointeur:

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

Il est un peu gênant parce que vous devez alors déréférencer deux fois:

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

it->second->foo(); 

mais avec un map il est beaucoup moins confus que de vector ou set (ce serait (*it)->foo().

Enfin, il y a quelques gotchas (ceux d'un pointeur):

  • Vous devez vous assurer que l'objet pointé restera en vie aussi longtemps que vous souhaitez utiliser le pointeur
  • L'initialisation par défaut un pointeur est une valeur aléatoire, utilisant un comportement non défini provoque
  • Lorsque le pointeur est jeté, les restes d'objets (heureusement), mais cela ne signifie que vous devez faire ça va se détruit à un moment donné