Pourquoi ne puis-je stocker des références dans un std::map` en C++?
Je comprends que les références ne sont pas des pointeurs, mais un alias à un objet. Cependant, je ne comprends toujours pas exactement ce que cela signifie pour moi, en tant que programmeur, c'est à dire quelles sont les références sous le capot?
Je pense que la meilleure façon de comprendre ce serait de comprendre pourquoi il est je ne peut pas stocker une référence à une carte.
Je sais que je dois arrêter de penser de références comme syntaxiques suger sur les pointeurs, juste ne sais pas comment faire :/
- Ne pense pas que de références que la restriction de pointeurs. Pensez à eux comme des alias pour les objets existants qui ne sont pas autorisés à être laissés ballants.
Vous devez vous connecter pour publier un commentaire.
Ils façon dont je le comprends, les références sont mis en œuvre à titre indicatif sous le capot. La raison pour laquelle vous ne pouvez pas stocker dans une carte est purement sémantique; vous devez les initialiser une référence quand il est créé et vous ne pouvez pas le modifier par la suite plus. Ce n'est pas de maillage avec la façon dont une carte œuvres.
Vous devriez penser à une référence comme un "const pointeur vers un non-const objet":
En outre, une référence ne peut être construit comme un alias de quelque chose qui existe (ce qui n'est pas nécessaire pour un pointeur, bien que souhaitable en dehors de NULL). Cela ne garantit pas que l'objet va rester autour de (et en effet, vous pourriez avoir un noyau lors de l'accès à un objet par le biais d'un renvoi, si elle n'est pas plus), pensez à ce code:
Maintenant, il y a deux conditions pour un conteneur STL:
Donc, dans des conteneurs STL, vous devez utiliser des proxys ou des pointeurs.
Maintenant, à l'aide de pointeurs pourrait s'avérer problématique pour la gestion de la mémoire, de sorte que vous peut-être:
NE PAS utiliser auto_ptr, il y a un problème avec affectation, car il modifie la main droite opérande.
Espère que cela aide 🙂
MyObject& firstProblem = *((MyObject*)0);
est déjà un comportement indéfini (vous n'êtes pas initalizing la référence à un objet valide) et donc ce qui est, selon la norme C++, a permis de formater votre disque dur ou faire d'autres choses mauvaises pour vous. (Nasale démons, anyone?) Mais c'est un point mineur, et sinon, la vôtre est une excellente réponse. +1L'importante différence à part le sucre syntaxique est que les références ne peuvent pas être modifiée pour faire référence à un autre objet que celui qu'ils ont été initialisés avec. C'est pourquoi ils ne peuvent pas être stockés dans les cartes ou dans d'autres contenants, parce que les conteneurs doivent être en mesure de modifier le type de l'élément qu'ils contiennent.
Comme une illustration de ceci:
en fait, vous pouvez utiliser des références dans une carte. je ne le recommande pas pour les gros projets car il pourrait causer bizarre erreurs de compilation mais:
de sorte que vous pouvez utiliser la carte, mais il sera difficile de garantir qu'il sera utilisé correctement, mais je l'utilise pour les petits codes (généralement concurrentiel) codes
Un conteneur qui stocke une référence a pour initialiser tous ses éléments lors de sa construction et, par conséquent, est moins utile.
Aussi, une fois initialisé, le stockage des éléments conteneur ne peut pas être modifié. s_ sera toujours reportez-vous à l'espace de stockage de s ci-dessus.
Ce post explique comment les pointeurs sont mises en œuvre sous le capot - http://www.codeproject.com/KB/cpp/References_in_c__.aspx, qui prend également en charge sebastians réponse.