Tout d'abord, l'opérateur technique *
unaire est évaluée à un lvalue dans ce cas. Cependant, le terme lvalue en C désigne essentiellement quelque chose qui a un emplacement (adresse) en mémoire (mémoire). En terminologie C++, les fonctions paires sont lvalues . Donc, encore une fois, dans votre exemple ci-dessus l'unaire *
donner une lvalue. Vous pouvez prendre l'adresse de ce lvalue, si vous souhaitez le faire, à savoir que vous pouvez évaluer &*i
, &i->first
et &i->second
(en supposant que le unaire intégré &
). Deuxièmement, puisque votre exemple original implique l'affectation, vous devez parler en fait de lvalues modifiables. Vous voyez, la propriété d'être lvalue par lui-même a très peu à voir avec être assignable. Pour utiliser l'opérateur d'affectation intégré, vous avez besoin d'un modifiable lvalue. Ce que vous obtenez d'un itérateur déréférencé est value_type
de std::map
. C'est une paire avec un premier membre const-qualifié, comme vous le savez déjà. Cela rend automatiquement le premier membre non modifiable, ce qui rend la paire entière non modifiable par l'opérateur d'affectation intégré. Le deuxième membre de la paire est modifiable, comme vous l'avez déjà observé.
Ainsi, une fois encore, l'opérateur de déréférencement dans ce cas retourne une lvalue. Cette lvalue est non modifiable dans son ensemble, et son premier membre est également non modifiable. Son deuxième membre est une lvalue modifiable. Comme pour votre hypothèse sur la façon dont les éléments de std::map
sont stockés, je dirais que dans une implémentation typique, ils seront stockés en tant qu'objets pair<const K, V>
, c'est-à-dire exactement ce que l'opérateur de déréférencement évalue.Normalement, la carte n'a pas besoin de modifier la partie clé de la paire après son initialisation, donc elle ne devrait pas rencontrer de problèmes avec le fait que le premier membre de la paire est const-qualifié.
http://www.cplusplus.com/reference/std/utility/make_pair/ - – DumbCoder
@DumbCoder: J'aimerais savoir si '* i' renvoie une * référence * à un objet pair, ou à une paire object, ou certaines classes proxy convertibles en 'pair', mais qui fournit une sémantique lvalue. –
> Débogué et montre un objet paire modélisé, en cours de construction et retourné. – DumbCoder